并發(fā)是我們在多線程操作和資源限制時經(jīng)常碰到的業(yè)務場景,解決方案也有很多,這里記錄兩種。
1.使用NSOperationQueue來控制
NSOperationQueue *queue = [[NSOperationQueue alloc] init];//創(chuàng)建隊列
queue.maxConcurrentOperationCount = 3;//設置并發(fā)數(shù)
for (NSInteger i = 0; i < 100; i ++) {
// 使用 NSBlockOperation 創(chuàng)建操作
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
[NSThread sleepForTimeInterval:2]; // 模擬耗時操作
NSLog(@"blockOperatio---i:%ld+%@",(long)i, [NSThread currentThread]); // 打印當前線程
}];
[queue addOperation:operation];//加入隊列
}
NSOperation是基于GCD的封裝,更加的面向對象,使用起來更加便潔。
2.使用GCD的信號量來控制
dispatch_semaphore_t sema = dispatch_semaphore_create(5);//創(chuàng)建信號量
for (NSInteger i = 0; i < 100; i ++) {
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);//等待信號,直到信號量大于0時才可以操作,同時將信號量-1,小于0時阻塞不往下執(zhí)行
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[NSThread sleepForTimeInterval:2];// 模擬耗時操作
NSLog(@"i=%ld",i);
dispatch_semaphore_signal(sema);//信號量通知,即讓信號量+1
});
}
信號量這個詞我們并不陌生,學校里操作系統(tǒng)中有生產(chǎn)者消費者模型,通過信號量進行資源競爭,完成程序調度。
3.也可以自己來判斷,維護兩個數(shù)組,一個存儲所有任務A,一個存儲待執(zhí)行任務B,每次任務執(zhí)行完的回調里檢測B是否小于并發(fā)數(shù),小于時從A中添加到并發(fā)限制。