iOS 技術篇:如何處理多個網絡請求的先后(依賴)關系


在開發過程中,不知你有沒有碰到過在一個頁面 用到了多個網絡請求,而且根據業務需求,需要有次序的執行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];
 

 

 
        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM