2013-12-15 1 views
1

무언가가 여러 번 새로 고침을 연속적으로 받으면 몇 가지 경우가 있습니다. 예 : - ViewController는 여러 KVO 알림을받습니다. - 여러 설정이 변경 될 때 새로 고침하도록 setter에서 호출되는 Datamanger 클래스입니다.데이터를 새로 고치기위한 호출을 대기열로 보내는 좋은 방법은 무엇입니까?

이상적으로 시리즈에서 마지막 새로 고침 호출 만 실행하고 싶습니다 (모든 중간 호출을 삭제하십시오).

- (id)init { 
    ... 
    [self observeValueForKeyPath:@"isRefreshing" ....]; 
} 

- (void)setParameter:(NSInteger)parameter { 
    .... 
    [self refresh]; 
} 
/* and many more kinds of updates require a refresh */ 
- (void)setAnotherProperty:(NSArray*)array { 
    .... 
    [self refresh]; 
} 

- (void)refresh { 
    if (self.isRefreshing) { 
     self.needRefresh = YES; 
     return; 
    } 
    self.isRefreshing = YES; 
    ... 
    self.isRefreshing = NO; 
} 

- observeValueForKeyPath..... { 
    if (!self.isRefreshing && self.needsRefresh) { 
     self.needsRefresh = NO; 
     [self refresh]; 
    } 
} 

는 이런 종류의 문제에 대한 더 나은 솔루션이 있습니까 :

은 지금 나는 isRefreshing 재산과 과도한 새로 고침을 차단하는 needRefresh, 예를 사용하고 있습니다?

답변

1

동시성을 1로 설정하여 NSOperationQueue을 만들고 작업 수가 0 일 때만 새 작업을 제출할 수 있습니다. (또는 취소 논리를 사용하여 보류중인 작업을 제거하여 진행중인 작업이 있으면 하나의 새로운 작업 만 대기열에 넣습니다.)

단일 스레드 시스템에는 적합하지만 여러 스레드에 대해서는 상당히 복잡합니다. .

0

잠시 동안 새로 고침을 지연해야하는 것처럼 보입니다. 다른 기술을 사용하여 그렇게 할 수 있습니다. 플래그 하나만 있으면 충분합니다. 예를 들어 당신은 하나의 주 실행 루프 사이클에 대한 답장을 보내

- (void)setParameter:(NSInteger)parameter { 
    .... 
    [self requestRefrhesh]; 
} 
- (void)setAnotherProperty:(NSArray*)array { 
    .... 
    [self requestRefrhesh]; 
} 

... 

-(void) requestRefrhesh { 
    if (self.refreshRequested) { 
     return; 
    } else { 
     self.refreshRequested = YES;  
     dispatch_async(dispatch_get_main_queue(), ^(void){ 
      //Run in main UI thread 
      //make your UI changes here 
      self.refreshRequested = NO; 
     }); 
    } 
} 
+0

감사를 지연하기 위해 비동기 블록을 사용할 수 있지만이 솔루션은 업데이트가 진행 중일 때 마지막 요청받은 삭제합니다. 하지만 지금은 디스패치 블록을 사용하고 있습니다. –

관련 문제