iOS 좋아요 기능 높은 동시 사고

앞말


웨이보에서 핫이슈에 대한 좋아요 수 W.서버가 이렇게 높은 동시 요청을 받는 것은 틀림없이 매우 큰 압력을 받을 것이다.데이터베이스에서 이 좋아요를 어떻게 쓰는지 탐구하지 않겠습니다(정말 큰 프로젝트입니다. 한 개씩 받을 때마다 한 번씩 쓰겠습니다). iOS 핸드폰에서 좋아요 기능을 어떻게 처리하는지만 탐구하겠습니다.
본고는 위챗과 위챗을 참고하여 그 실현을 추측하고 좋아요 기능을 어떻게 처리하는지 탐구하고자 한다.
위챗 모멘트의 좋아요 수는 상대적으로 적다.웨이보의 좋아요 수는 다섯 자릿수에 달한다.그것은 반드시 다른 전략을 채택해야 한다.

먼저 거시적으로 이 문제를 생각하다.


서버의 최신 좋아요 수 좋아요 단추와 네트워크의 상호작용을 언제 얻을지 두 종류로 나뉜다
  • 휴대전화 측은 모든 메시지에 대해 실시간으로 좋아요 수를 추적하지 않고 어떤 상황에서만 데이터를 요청할 수 있다(상세 페이지에 들어가기 등).
  • 매번 좋아요/취소 단추를 눌렀을 때마다 요청을 발송합니다. 사용자는 마지막 동작의 효과를 기대합니다.그러나 네트워크 문제가 발생하면 데이터베이스에 쓰는 값은 제어할 수 없다.그러면 버튼 이벤트는 어떻게 처리해야 하나요?

  • 서버의 최신 좋아요를 언제 받을 수 있습니까?

  • 먼저 웨이보가 다른 사람에 대한 웨이보를 연구한다.처음에 로컬 저장소의 좋아요 수를 사용해서 상세 페이지에 눌러야만 네트워크에 좋아요 수를 한 번 얻고 로컬 저장소를 업데이트할 수 있습니다.(한 번만 발기하면) 자신이 보낸 웨이보에 대해 연구하지 않고 만 년 동안 웨이보를 보내지 않으면 좋아요를 받으면 푸시를 받는다는 인상을 받는다.
  • 위챗 연구
  • 모멘트를 열고 현지의 데이터를 먼저 사용하지만 다른 사람이 보낸 모멘트로 미끄러질 때.새로운 좋아요가 있으면 (지연이 있으면 인터넷 요청이 정체될 것입니다.)
  • 자신이 보낸 모멘트를 다시 보러 왔는데 하트를 받고 미끄러져 내려가니 이 하트가 저기 누워 있었다. 지연이 없었다.보기가 자신이 보낸 모멘트 안에 잠겨 있으면(아래 그림) 좋아요를 누르면 빨간색 동적이 보이기 때문에 업데이트됩니다.빨간색 점 동적을 받았을 때도 좋아요 메시지가 표시되고 필요하면 UI를 새로 고칩니다.다른 사람이 자기가 보낸 모멘트에 첫 좋아요?
  • 두 번째 점에 대해 좀 더 깊이 들어가다.자신이 보낸 모멘트에서 누군가가'좋아요'를 눌렀을 때 빨간 점을 확인한 후 이 사람은 취소->다시 좋아요를 눌렀다.위챗에는 빨간 점이 표시되지 않습니다.다시 말하면 새로운 동태에 속하지 않는다.
  • 다른 사람의 좋아요를 누르면 이 모멘트에 새로운 움직임이 생겨도 좋아요 메시지가 새로 고쳐진다.
  • 자세한 정보 페이지를 클릭하면 반드시 새로 고침됩니다.

  • 그래서 자신이 추적하는 모멘트에 대해 어떤 모멘트의 새로운 동태를 알 수 있는 특별한 API가 있을 것이라고 대담하게 추측했다.이 API는 정시 액세스를 사용할 수 있으며 간혹 한 번만 액세스할 수 있습니다.듀우수의 말에 의하면 소켓이나 프로토타입 같은 고속 http 요청일 수도 있다.
  • 요약
  • cell에 미끄러져 이 cell을 리셋합니다(한 번).
  • 추적에 대한 새로운 정보를 얻기 위해 특수한 API를 사용합니다.
  • 상세한 페이지에 들어가면 반드시 최신 좋아요 정보를 얻을 수 있습니다.


  • 물론 구체적인 상황은 이보다 훨씬 복잡하다. 이상은 바로 개인이 멋대로 추측한 것이다.

    좋아요 버튼과 네트워크의 상호작용

    App 사용자가 기대하는 좋아요 상태와 데이터베이스 데이터는 어쨌든 일정한 일치를 보장할 수 없다.
    그러나 어떻게 가능한 한 일치를 이룰 수 있을까?이 문제에 대하여 개인의 우견을 제기하다.
    아니면 먼저 위챗과 위챗에서 착안하여 생각하세요.
  • 네트워크가 없는 상태에서 마이크로 UI 불변 상태는 물론 요청도 하지 않습니다.위챗 UI의 좋아요 효과는 처음에는 좋아요를 누르지 않았고, 결국 UI는 좋아요로 설정되었다.그나저나 결과는 인터넷 접속 후 상세 페이지까지 보니 확실히 좋아요를 눌렀다.하지만 위챗을 닫고 다시 열면 좋아요가 보이지 않습니다.
  • 아주 나쁜 네트워크 상태에서 2G 네트워크가 실측되었다. 세 개의 마이크로 블로거가 좋아요가 없는 상태에서 좋아요를 여러 번 눌렀다가 취소했다. 앱에서 4G를 종료한 후에 서버를 열어본 상태에서 어떤 것은 좋아요를 눌렀고 어떤 것은 없었다.즉 확정하기 어렵다.2G 네트워크 실측, 위챗에서 좋아요를 누른 후 좋아요를 취소하자 UI가 갑자기 좋아요 상태가 되었습니다.요청이 성공하면 로컬 데이터와 UI를 새로 고쳐야 합니다.
  • 어떻게 비교적 합리적으로 실현할 것인가
  • 다음은 순전히 개인적인 우견입니다. 더 좋은 실현 방법이 있다면 대장부가 제기한 것을 환영합니다.

    우선 UI 표시 방법


    먼저 간단하고 만능적인 방법을 말해라.
    때때로 사용자가 의식적으로 시작한 네트워크 요청은 우리는'로드 중'을 표시하고 심지어 사용자가 클릭하지 못하게 한다.그리고 요청이 성공적으로 처리된 후에 사용자가 클릭하도록 합니다.예를 들어 로그인 인터페이스에서 로그인을 클릭하면 우리는'로그인중'을 표시하고 사용자가 다른 조작을 하는 것을 금지합니다.예를 들어 좋아요를 눌렀을 때 사용자가 다른 조작을 하지 못하게 하고'발기 요청 중'을 표시합니다.성공하면 버튼 상태를 바꾸고, 실패하면'좋아요 실패/좋아요 취소 실패'를 알립니다.이렇게 하면 높은 합병과 기대치가 다르지만 사용자가 모르는 상황을 완전히 피할 수 있다.
    그러나 이런 방법은 사용자 체험이 좋지 않다.그러나 사용자 체험을 선택했다면 심심할 수도 있다는 문제가 있다. 버튼을 계속 누르고 요청을 많이 하면 휴대전화 메모리와 서버에 큰 스트레스를 준다.서버의 데이터를 마지막으로 쓰는 것이 사용자의 기대치가 아닐 수도 있습니다.그러나 주류 앱은 사용자 체험을 위해 이런 결과를 책임진다.
    그래서 서버에 추가 처리를 하는 것 외에 휴대전화 단말기도 높은 병행 압력을 줄일 필요가 있다.
    여기서 나는 위챗의 방법을 더욱 선호한다. 버튼 2급view에 표시하면 사용자가 좋아요를 잘못 눌렀다가 취소할 가능성을 줄일 수 있다.네트워크 요청을 완료할 시간도 주었다.
    UI를 먼저 변경하고 요청이 실패하면 다시 바꾸고'요청 실패'를 제시하는 아이디어도 있다.위챗에서'좋아요를 누르면 발송되지 않음'을 빨간색으로 표시합니다.비슷할 거예요.

    그리고 언제 인터넷 요청을 할 거예요?


    웨이보야, 그건 내가 못 알아봤어. 인터넷 상황에서 클릭할 때마다 요청을 하고 마지막 결과를 인연으로 봤어?
    위챗의 좋아요 요청은 바로 보내야 하지만 좋아요를 취소하는 것은 말하기 어렵다.2G 때 좋아요를 누른 후 바로 좋아요를 취소했는데 결국 좋아요를 눌렀기 때문이다.
    매번 클릭할 때마다 보내는 것은 높은 합병과 기대치 편차를 초래하기 가장 쉬운 조작이다.그래서 클릭할 때마다 이런 수연법을 보내는 것은 권장하지 않는다.
  • 방법1
  • 위챗에서 첫 번째 요청을 변경해야 한다고 추측합니다. 요청 기간에 버튼을 누르면 모양만 바뀌고 요청이 성공하면 로컬 데이터와 UI를 새로 고칩니다.그리고 다음 요청을 허락합니다.
    그러면 질문이 하나 있습니다. 웨이보에서 방금 좋아요 요청을 보내고 상세 페이지에 눌렀습니다.그래서 점점프 전에 판단하여 요청 없이 상세 컨트롤러에 알림을 등록했습니다.요청이 성공하면 알림을 보내고 상세 컨트롤러가 데이터를 갱신하도록 알립니다.
    추측 코드는 다음과 같다.
    NSMutableArray *isRequestingArray;// cell  BOOL
    
    - (void)btnClick:(UIButton *)btn atIndexPath:(NSIndexPath *)indexPath {
        //  btn 
        btn.selected = !btn.selected; 
        //    
        //  
        if (![_isRequestingArray[indexPath.section][indexPath.row] boolValue]) { //  
            // 
            _isRequestingArray[indexPath.section][indexPath.row] = @"1"; 
            __weak typeof(self) wself = self;
            [PraiseAPI startWithSuccessBlock:^(__kindof BaseRequest *request){
                __strong typeof(wself) sself = wself;
                sself->isRequestingArray[indexPath.section][indexPath.row] = @"0";
                //  btn 
                //  
                //  
            } failureBlock:^(__kindof BaseRequest *request, NSError *error) {
                __strong typeof(wself) sself = wself;
                sself->isRequestingArray[indexPath.section][indexPath.row] = @"0";
                //  btn 
            }];
        }
    }
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        NextViewcontroller *nextVC = [[NextViewcontroller alloc] init];
        if ([_isRequestingArray[indexPath.section][indexPath.row] boolValue]) {
            //   nextVC 
        }
        [self.navigationController pushViewController:nextVC animated:YES];
    }
    
  • 방법2 그러나 웨이보 사람들은 손을 잘못 눌러서 바로 좋아요를 취소할 수 있다.이럴 때 첫 번째 방법을 채택하는 것은 그다지 좋지 않다.이때 우리는 요청을 지연 발송하는 정책을 채택해야 한다.

  • 클릭 후 2s내에 다시 클릭하지 않고 원상태와 다르면 네트워크 요청을 시작합니다.보기가 인터페이스를 종료할 때도 바로 네트워크 요청을 시작합니다.
  • 방법은 세 번째로 어떤 친구의 말에 의하면 인터페이스에 현재 시간을 추가하여 들어간다.서버는 마지막 시간에 기록합니다.문제는 고병발 문제를 해결하지 못했다는 것이다.

  • 아직 완벽하게 생각하지 못했으니 벽돌을 던져 옥을 끌어들였으면 좋겠다.

    좋은 웹페이지 즐겨찾기