2013-04-04 41 views
0

我正在使用MKNetworkKit庫來對服務器進行REST調用。當用戶想要創建照片喜歡或不喜歡時,會調用此特定的片段集。如果我們只爲單張照片設置最喜歡的標誌,這是非常直接的objective-c塊代碼。不過,我在GUI中推出了多選機制,以便用戶可以選擇多張照片並一次全部收藏。在一個函數內跟蹤多個REST調用完成的好習慣

我寫的功能做得很好,但對我來說感覺不太乾淨。

我不喜歡什麼:

  • 跟蹤所有的回調有塊計數器。我想知道是否有更優雅的方式來處理這個問題。

  • 兩個完成塊中都存在相同的代碼。然而,這只是MKNetworkKit的使用方式(一塊成功,一塊出錯)。我想,如果我將這個方法做成一個實例方法,我可以通過調用另一個方法來處理它,但是看起來就像做混亂的所有設置一樣。我想保持這是一個方便的類方法實用程序。

建議?

+(BOOL)updateAssets:(NSArray*)assets 
     isFavorite:(BOOL)isFavorite 
     completion:(MyAssetCompletion)completion // (BOOL success) 
{ 

    assert(assets); 
    if (assets == nil || assets.count == 0) return NO; 

    __block BOOL bError = NO; 
    __block NSInteger counter = 0; // Use a counter to track number of completed REST calls 
    for(MyAsset *asset in assets){ 
     MyUpdateAssetForm *form = [[MyUpdateAssetForm alloc] init]; 
     form.isPrivate = isFavorite ? @(1) : @(0); 
     [[MyRESTEngine sharedInstance] updateAssetWithUUID:asset.UUID 
                withForm:form 
               completionBlock:^{ 
                counter++; 
                if(counter == assets.count){ 
                 completion(bError == NO); 
                } 
               } errorBlock:^(NSError *error, NSString *additionalInfo) { 
                bError = bError || YES; 
                counter++; 
                if(counter == assets.count){ 
                 completion(bError == NO); 
                } 
               }]; 
    } 
    return YES; 
} 
+0

僅供參考,在未來,我們的服務器將接受的資產清單,所以我將只需要進行一次電話,但直到那時..... – VaporwareWolf 2013-04-04 19:02:22

+0

我和你在一起,因爲它看起來有點醜陋,但據我所知,這是處理多個回調的正確方法。 – Taum 2013-04-04 20:58:11

回答

0

你可以試試這個(未經測試):
(順便說一下,你目前的實現不是線程安全的,因爲計數器可能會從一個以上的線程在一個非原子的方式遞增)
@看到NSConditionLock

- (BOOL) updateAssets:(NSArray*)assets 
      isFavorite:(BOOL)isFavorite 
      completion:(bool_block_t)completion 
{ 
    assert(assets && [assets count]); 

    __block NSMutableArray* failed = [NSMutableArray new]; 
    __block NSConditionLock* lock = [[NSConditionLock alloc] initWithCondition:[assets count]]; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
        ^{ 
         [lock lockWhenCondition:0]; 
         completion([failed count] == 0); 
        }); 
    NSNumber* val = (isFavorite ? @1 : @0); 
    for (MyAsset* asset in assets) { 
     MyUpdateAssetForm* form = [[MyUpdateAssetForm alloc] init]; 
     form.isPrivate = val; 
     [self updateAssetWithUUID:asset.UUID 
         withForm:form 
        completionBlock:^{[lock unlockWithCondition:[lock condition] - 1];} 
         errorBlock:^(NSError *error, NSString *additionalInfo) 
     { 
      [lock lock]; 
      [failed addObject:asset]; 
      [lock unlockWithCondition:[lock condition] - 1]; 
     }]; 
    } 
    return YES; 
} 
相關問題