0

내가 performSelector:withObject:afterDelay:을 사용하여 로그 메시지를 표시하기 위해 빠르게 변화하는 테이블보기의 업데이트 속도를 조절하려고 해요 :연속 performSelector를 무시 : withObject : afterDelay을 : 큐 메시지를 확인하여

  • 첫 번째 새 로그 메시지 것이다 최소 지연 (0.5 초) 후에 테이블 업데이트를 예약하십시오.
  • 최소 지연 이전의 연속적인 로그 메시지는 무시해야합니다.
  • 테이블보기를 업데이트 한 후 새 업데이트를 다시 예약 할 수 있습니다.

Similar 질문은 첫 번째 전화 cancelPreviousPerformRequestsWithTarget:을 호출하여 원래 통화를 "다시 예약"합니다.

  • GCD이 더 나은 것 (나는 것이라고 확신한다), 그것은 (확실하지 않은) 간단 할 것이다 경우 :

    또한 나는 궁금했다.
  • 정말 최소한의 새로 고침 간격이 필요합니까, 아니면 테이블보기가 다시 업데이트 할 준비가되면 지금으로 가야합니까 (0.5 초는 장치와 작업 부하에 따라 길거나 불충분 할 수 있습니다).

관심있는 사람들을 위해 저는 this을 리팩토링하고 있습니다.

답변

1

음은 performSelector에 포기하고 꽤 잘 작동되는 GCD 솔루션을 내놓았다 :

직렬 큐 _consoleQueue = dispatch_queue_create("console_queue", NULL)을 만듭니다.

메시지 처리 코드 _updateScheduled은 후속 호출을 무시하는 플래그로 작동합니다. 일관성을 보장하기 위해 플래그는 _consoleQueue에서만 읽고 수정합니다.

- (void)logMessage:(DDLogMessage *)logMessage 
{ 
    dispatch_async(_consoleQueue,^
    { 
     [_newMessagesBuffer insertObject:logMessage 
           atIndex:0]; 

     // Ignore subsequent calls when already scheduled 
     if (_updateScheduled) 
      return; 

     NSTimeInterval timeToWaitForNextUpdate = _minIntervalToUpdate + _lastUpdate.timeIntervalSinceNow; 
     if (timeToWaitForNextUpdate > 0) 
     { 
      // Start ignoring calls 
      _updateScheduled = YES; 
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeToWaitForNextUpdate * NSEC_PER_SEC)), _consoleQueue,^
          { 
           [self updateTableViewInConsoleQueue]; 

           // Stop ignoring calls 
           _updateScheduled = NO; 
          }); 
     } 
     else 
     { 
      [self updateTableViewInConsoleQueue]; 
     } 
    }); 
} 

- (void)updateTableViewInConsoleQueue 
{ 
    _lastUpdate = NSDate.date; 

    // ... 
} 

는 그러나 나는 아직도 _minIntervalToUpdate을 사용하지 않도록하고 테이블 뷰가 "준비"때 바로 업데이트하는 방법을 모르겠어요.