在說NSOperation之前汹族,先說一下gcd讼昆,gcd 技術是一個輕量的托享,底層實現暗藏的神奇技術,咱們可能通過gcd和block輕松實現多線程編程浸赫,有時候闰围,gcd相比其余零碎提供的多線程辦法更加無效,當然既峡,有時候gcd不是最佳抉擇羡榴,另一個多線程編程的技術 NSOprationQueue 讓咱們可能將后盾線程以隊列形式依序執(zhí)行,并提供更多操作的入口涧狮,這和 gcd 的實現有些相似炕矮。
這種相似不是一個偶合,在晚期者冤,MacOX 與 iOS 的程序都廣泛采納Operation Queue來進行編寫后盾線程代碼肤视,而之后呈現的gcd技術大體是按照前者的準則來實現的,而隨著gcd的遍及涉枫,在iOS 4 與 MacOS X 10.6當前邢滑,Operation Queue的底層實現都是用gcd來實現的。
所以,目前能夠利用Operation Queue下層的封裝困后,比擬繁難的實現更簡略的多線程操作乐纸。
在復用控件,或者多任務執(zhí)行的狀況下摇予,防止不了要開啟多個線程和中斷線程汽绢。
此時,咱們就能夠應用NSOperation來異步執(zhí)行工作和中斷工作侧戴。
包含IOS UITableView和UICollectionView中的cell復用狀態(tài)下的多線程操作
@property (strong, nonatomic) NSOperationQueue *operationQueue;
@property (strong, nonatomic) NSMutableDictionary *operationDict;
- (NSMutableDictionary *)operationDict {
if (!_operationDict) {
_operationDict = [NSMutableDictionary dictionary];
}
return _operationDict;
}
- (NSOperationQueue *)operationQueue {
if (!_operationQueue) {
_operationQueue = [[NSOperationQueue alloc] init];
_operationQueue.maxConcurrentOperationCount = 6;
}
return _operationQueue;
}
//控件顯示開啟工作
- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
if (![self.operationDict objectForKey:@(indexPath.item).stringValue]) {
NSBlockOperation *operation = [self operationEvent:indexPath.item];
[self.operationQueue addOperation:operation];
[self.operationDict setObject:operation forKey:@(indexPath.item).stringValue];
}
}
//控件隱沒中斷工作
- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
if (self.operationDict[@(indexPath.item).stringValue]) {
NSBlockOperation *operation = self.operationDict[@(indexPath.item).stringValue];
[operation cancel];
[self.operationDict removeObjectForKey:@(indexPath.item).stringValue];
}
}
//異步工作
- (NSBlockOperation *)operationEvent:(NSInteger)index {
WEAKSELF
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
}];
return operation;
}
- (void)dealloc
{
NSLog(@"開釋%@",self);
[self.operationQueue cancelAllOperations];
}
在暗藏和顯示復用控件中中斷和開啟工作宁昭。能夠在以后控件下解決各種簡單工作而不會抵觸。例如圖片加載酗宋,圖片壓縮积仗,下載回調,異步讀取資源等多種狀況下都十分實用蜕猫。