2014-10-29 28 views
0

init類的方法中,我觸發了兩個通過委託響應的API調用。當兩個調用都返回數據時,類本身需要發送完成處理程序。我已經嘗試過使用GCD和一個調度組來完成這個任務,但我不完全確定代碼中的哪個部分需要放置notify部分。委託方法(didReceiveData被調用兩次,每次調用一次),可以以任何順序等,基本上我需要一種方法來知道它們何時完成,並將它們的兩組數據都返回到一個completionHandler中。當兩個API調用都完成時調用completionHandler?

我對從哪裏開始有點難過,我已經做了一些環顧四周,我不能得到GCD或NSOperation方法的工作。這個實例持續時間足夠讓兩個電話回來,但由於他們幾乎在同一時間回來,他們無法檢查另一個是否已完成。我不知道如何檢查,而且我也不確定在哪裏檢查。

+0

我相信我有其中的代碼你這麼拼命地尋找。給我一分鐘找到它。 – 2014-10-29 13:34:55

回答

0

我已經完成了這個使用NSNotifications。基本上,當每個API請求完成時,發佈一個NSNotification。添加NSNotification偵聽器來管理每次觸發通知時的跟蹤狀態。一旦收聽者已收到兩個通知,則可以調用completionHandler。

0

你總是可以設置一個計數器(整數屬性或調用方法靜態整數值)對類調用這兩個API請求,然後盡一切歸擋應該只做如果計數器具有一定的價值否則增加/減少計數器並等待另一個響應。這是一個不好的程序,但它是用最少的努力。

如果你想這樣做的正確的方式有好幾種方法:

  • 您可以創建一個專門處理這2個請求,幷包括響應作爲實例中的屬性的類。然後在響應塊中設置目標響應屬性,並檢查是否已經設置了其他響應,如果是,則調用輸入塊。
  • 您可以創建接收請求的數組和一個回調塊,那麼你要麼使用一個內部計數器,或者簡單的響應類。然後您計算每個收到的響應的響應計數,並查看是否有足夠的空間調用輸入回調模塊。
  • 您可以創建通過在那裏你在一個可變的字典,其中每個塊都應該設置一個特定的鍵(與響應對象或狀態代碼或其他)傳遞塊的系統和每個回調,然後檢查是否有在字典足夠的對象繼續這個過程。

有這麼多的可能性......我總是建議嘗試使它,所以你至少有類中的代碼調用這組請求儘可能和第一個程序將做到這一點。但是,如果您有很多情況下調用不同的請求集,那麼最好創建一個更通用的系統,如第二個和第三個過程中提到的那樣。

0

我能做到這一點,而不delegates所以IDK的你的感受有關,但這並工作。我不得不調整一下代碼,所以可能有一兩個錯誤,因爲可能有些變量不存在,因爲我刪除了這個答案。

如果我沒有完全回答你想要的東西,或者如果你有任何問題,在[email protected]給我發電子郵件。COM

類API

API.h

-(void)getMyDataWithCompletionHandler:(void (^)(NSMutableArray *firstData, NSMutableArray *secondData))Final_callBack;

API.m

-(void)getMyDataWithCompletionHandler:(void (^)(NSMutableArray *firstData, NSMutableArray *secondData))Final_callBack { 

    NSString *firstURL = @"www.firstURL.com"; 
    NSString *secondURL = @"www.secondURL.com"; 

    __block bool firstIsBack = false; 
    __block bool secondIsBack = false; 

    __block NSMutableArray *firstArray = [NSMutableArray new]; 
    __block NSMutableArray *secondArray = [NSMutableArray new]; 

    [self getFirstData:firstURL 
      withCallBack:^(NSMutableArray *firstData) { 
       firstIsBack = true; 
       firstArray = firstData; 
       if (firstIsBack && secondIsBack){ 
         Final_callBack(firstArray,secondArray); 
       }  

       } 
    }]; 

    [self getSecondData:secondURL 
      withCallBack:^(NSMutableArray *secondData) { 
       secondIsBack = true; 
       secondArray = secondData; 
       if (firstIsBack && secondIsBack){ 
        Final_callBack(firstArray,secondArray); 
       }  

       } 
    }];  
} 

視圖 - 控制

@property (strong, nonatomic) NSMutableArray *finalFirstArray; @property (strong, nonatomic) NSMutableArray *finalSecondArray;

- (void)viewDidLoad{ 
    [super viewDidLoad]; 
    API *myApi = [API new]; 
    //make first call to 
    [myApi getMyDataWithCompletionHandler:^(NSMutableArray *firstData, NSMutableArray *secondData) { 
     _finalFirstArray = firstData; 
     _finalSecondArray = secondData; 
    }]; 
} 
0

如果您使用的是調度組,每次通話只需要擔心自己的完成。總的想法是:

Init方法:先建立一個空調度組(新建或已平衡調用dispatch_group_enterdispatch_group_leave)。使每個API調用之前,調用dispatch_group_enter。一旦您完成了所有的API調用,調用dispatch_group_notify你完成處理。

委託方法:在調度組呼dispatch_group_leave。你如何提供調度組到您的委託,很大程度上取決於你的代碼是如何工作的。

你傳遞給dispatch_group_notify塊纔會被入列到隊列的目標,一旦調用到dispatch_group_enter數量等於調用dispatch_group_leave的數量。你已經做出一個呼叫dispatch_group_enter在你叫dispatch_group_notify時間每個請求,所以你需要一個dispatch_group_leave爲每個請求,這將觸發時評論的請求,返回他們的數據。需要注意的是調度組不關心你的舍友順序要求的回報,因爲所有它認爲是dispatch_group_leave沒有額外的參數調用。

相關問題