NSBlockOperationとGCDスレッドグループの組み合わせによるマルチスレッドダウンロードの最大同時数制御

5369 ワード

// NSOperationQueue
 - (NSOperationQueue *)queue {
    if(!_queue){
        _queue = [NSOperationQueue new];
        // 3
        _queue.maxConcurrentOperationCount = 3;
    }
    return _queue;
}

// 
 - (void)beginDownloadTask {
    NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        dispatch_group_t group = dispatch_group_create();
        dispatch_group_enter(group);
        NSLog(@" ");
        [self asyncDownloadCompleted:^{
            dispatch_group_leave(group);
            NSLog(@" ");
        }];
        //dispatch_group_wait, , group 
        dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
        NSLog(@"NSBlockOperation ");
    }];
    [self.queue addOperation:operation];
}
// 
 - (void)asyncDownloadCompleted:(void(^)(void))completedBlock {
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@" , :%@",[NSThread currentThread]);
        // 
        [NSThread sleepForTimeInterval:5];
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@" ");
            if(completedBlock){
                completedBlock();
            }
        });
    });
}
// 10 
 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    for(int i=0;i<10;i++){
        [self beginDownloadTask];
    }
}

印刷されたログは以下の通りである:2018-01-12 10:50:56.173984+0800 MultiDownload[108:108225]グループタスク2018-01-12 10:50:56.173983+0800 MultiDownload[108:1073387]グループタスク2018-01-12 10:50:56.174022+0800 MultiDownload[108:223]グループタスク2018-01-12 10:50:56.174338+0800 MultiDownload[108:226]グループタスク2018-01-12現在のスレッド:{number=3,name=(null)}2018-01-12 10:50:56.174346+0800 MultiDownload[1018:108227]ダウンロード中、現在のスレッド:{number=4,name=(null)}2018-01-12 10:50:56.174571+0800 MultiDownload[1018:10828]ダウンロード中、現在のスレッド:{number=5,name=(null)}2018-01-12 10:51:011.180133+0800 MultiDownload[108:107,164]ダウンロード完了2018-01-12 10:51:011.180500+0800 MultiDownload[108:107,164]グループタスク実行完了2018-01-12 10:51:011.180513+0800 MultiDownload[108:107:107387]NSBlockOperation実行完了2018-01-12 10:01-12 10:01-12 10:51:011.180795+0800 MultiDownload[108:107]ダウンロード完了2018-01-12 1.181042+0800 MultiDownload[10118:1071164]グループタスク実行完了2018-01-12 10:51:011.181065+0800 MultiDownload[10118:1071164]グループタスク実行完了2018-01-12 10:51:01010112 10:51:01.181080+0800 MultiDownload[10118:108181065]NSBlockOperation実行完了2018-01-12 10:51:011.181298+0800 MultiDownload[1018:0118:1081298+0800 MultiDownload[10118:108225]グループタスク実行完了2018-01-12 10:01:011.1818181298+0800 MultiDownload[10118:108225]グループタスク実行完了2018-01-12 10:0110 10 MultiDownload[1018:108226]ダウンロード中、現在のスレッド:{number=3,name=(null)}2018-01-12 10:51:01.1820009+0800 MultiDownload[1018:107]グループタスク実行完了2018-01-12 10:51:01.182022+0800 MultiDownload[1018:108223]NSBlockOperation実行完了2018-01-12 10:51:01.182596+0800 MultiDownload[1018:108223]NSBlockOperation実行完了現在のスレッド:{number=5,name=(null)}2018-01-12 10:51:01.183821+0800 MultiDownload[0118:108227]グループタスク2018-01-12 10:51:01.184539+0800 MultiDownload[0118:108223]のダウンロードに入り、現在のスレッド:{number=6,name=(null)}2018-01-12 10:51:066.186875+0800 MultiDownload[108:107,164]ダウンロード完了2018-01-12 10:51:06.187142+0800 MultiDownload[108:107,164]グループタスク実行完了2018-01-12 10:51:06.18787170+0800 MultiDownload[108:107218:107387]NSBlockOperation実行完了2018-01-12 10:01-12 10:51:06.187384+0800 MultiDownload[108:107]ダウンロード完了2018-01-12 10:5110:5151515:51:01-12 10:01-12 10:51:01-12 10:06.187513+0800 MultiDownload[1018:10828]グループタスク2018-01-12 10:51:06.187564+0800 MultiDownload[1018:107164]グループタスク実行完了2018-01-12 10:51:06.187573+0800 MultiDownload[1018:108227]NSBlockOperation実行完了2018-01-12 10:51:06.187795+0800 MultiDownload[1018:107287]ダウンロード中、現在のスレッド:{number=7,name=(null)}2018-01-12 10:51:06.187822+0800 MultiDownload[0118:107,164]ダウンロード完了2018-01-12 10:51:06.188008+0800 MultiDownload[0118:108,226]グループタスク2018-01-12 10:51:06.188820+0800 MultiDownload[101: 107,164]グループタスク実行完了2018-01-12 10:51:06.188824+0800 MultiDownload[1018:108,225]NSBlockOperation実行完了2018-01-12 10:51:06.189172+0800 MultiDownload[108:108227]ダウンロード中、現在のスレッド:{number=4,name=(null)}2018-01-12 10:51:06.190416+0800 MultiDownload[108:223]グループタスク2018-01-12 10:51:06.190718+0800 MultiDownload[108:2235]ダウンロード中、現在のスレッド:{number=8,name=(null)}2018-01-12 10:51:11.189808+0800 MultiDownload[108:107,164]ダウンロード完了2018-01-12 10:51:1.190120+0800 MultiDownload[108:107,164]グループタスク実行完了2018-01-12 10:51:1.190153+0800 MultiDownload[108:108,228]NSBlockOperation実行完了2018-01-12 10:51:1.190584+0800 MultiDownload[108:107387]グループタスク2018-01-12 10:51:11.190732+0800 MultiDownload[108:107164]ダウンロード完了2018-01-12 10:51:11.91016+0800 MultiDownload[108:227]ダウンロード中、現在のスレッド:{number=4,name=(null)}2018-01-12 10:51:11.91159+0800 MultiDownload[108:1071164]グループタスク実行完了2018-01-12 10:51:11.91178+0800 MultiDownload[108:10826]NSBlockOperation実行完了2018-01-12 10:51:11.91628+0800 MultiDownload[108:164]ダウンロード完了2018-01-12 10:51:11.91973+0800 MultiDownload[108:107]164グループタスク実行完了2018-01-12 10:51:11.191990+0800 MultiDownload[108:223]NSBlockOperation実行完了2018-01-12 10:51:16.196486+0800 MultiDownload[108:107164]ダウンロード完了2018-01-12 10:51:16.96807+0800 MultiDownload[108:1071644]グループタスク実行完了2018-01-12 10:51:16.196818+0800 MultiDownload[108:107387]NSBlockOperation実行完了
//印刷データから、並行してダウンロードするタスクが10個あることがわかりますが、同時に行われているのは3個しかありません.前のタスクが実行された後、後のタスクが実行されます.