參考:http://stackoverflow.com/questions/1049001/get-notification-when-nsoperationqueue-finishes-all-tasks
多線程編程中,操作隊列NSOperationQueue我們經常會用到的,簡化了多線程的操作。至於用法就不多介紹了。這裡要說的是隊列執行完畢的狀態檢查。
我們很多時候需要在隊列完成之後再進行操作,而何時隊列完成,NSOperationQueue並沒有內建的didFinishedSelector來供使用,因此需要自己去檢查其狀態。
因為NSOperationQueue相容 key-value coding (KVC) and key-value observing (KVO)機制,因此我們可以觀察NSOperationQueue的屬性。NSOperationQueue可供監控觀察的屬性有:
operations - read-only property
operationCount - read-only property
maxConcurrentOperationCount - readable and writable property
suspended - readable and writable property
name - readable and writable property
實現如下:
1.初始_parseQueue
- (NSOperationQueue *)parseQueue{ if (nil == _parseQueue) { _parseQueue = [[NSOperationQueue alloc] init]; [_parseQueue setSuspended:YES]; //[_parseQueue setMaxConcurrentOperationCount:1]; [_parseQueue addObserver:self forKeyPath:@"operations" options:0 context:nil]; } return _parseQueue;}
2.加入operation
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(myTask) object:nil]; [self.parseQueue addOperation:operation]; [operation release];
3.觀察值的改變:
//KVO,觀察parseQueue是否執行完- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ if (object == self.parseQueue && [keyPath isEqualToString:@"operations"]) { if (0 == self.parseQueue.operations.count) { DLog(@"parse finished"); //other operation [_parseQueue setSuspended:YES]; } } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; }}
選擇對NSOperationQueue的operations進行觀察,而不選operationCount是因為operationCount需要iOS 4.0以上。