在開發過程中,不知你有沒有碰到過在一個頁面 用到了多個網絡請求,而且根據業務需求,需要有次序的執行A B C 網絡請求?
你可能會想到,我在A的請求成功回調里去處理B,在B的回調里去請求C,但你后來會發現整個頁面的網絡請求邏輯已經亂套了.因為往往在網絡請求之后會去做一些UI界面的操作.
那應該如何高質量的處理這種情況呢?請往下看:
在前段時間里.我也碰到了這種情況.而我想到的是通過兩種方式來解決(不敢獨享所以希望能幫到需要的人):
1.通過信號量來實現(信號量就三個函數dispatch_semaphore_create , dispatch_semaphore_wait , dispatch_semaphore_signal)
代碼如下
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1); dispatch_queue_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //任務1 dispatch_async(quene, ^{ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); for (int i = 0; i<10; i++) { NSLog(@"j的值是:%d",i); } dispatch_semaphore_signal(semaphore); }); //任務2 dispatch_async(quene, ^{ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); for (int i = 0; i<20; i++) { NSLog(@"i的值是:%d",i); } dispatch_semaphore_signal(semaphore); });
2. (推薦)通過 NSOperationQueue 中的依賴關系來操作,NSOperation 是對GCD的封裝實現的,所以其優點肯定是高於GCD的.代碼如下.
NSOperationQueue * queueeTest = [[NSOperationQueue alloc]init]; queueeTest.maxConcurrentOperationCount = 1; NSBlockOperation * optionA = [NSBlockOperation blockOperationWithBlock:^{ for (int i = 0; i<10; i++) { NSLog(@"i的值是:%d",i); } }]; NSBlockOperation * optionB = [NSBlockOperation blockOperationWithBlock:^{ for (int j = 0; j<20; j++) { NSLog(@"j的值是:%d",j); } }]; //A依賴於B [optionA addDependency:optionB]; [queueeTest addOperation:optionA]; [queueeTest addOperation:optionB];