2013-04-04 39 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; 
} 
相关问题