多个异步Web服务请求NSURLConnection iOS

Sil*_*ail 5 iphone network-programming objective-c nsurlconnection nsurlrequest

我有一个问题,我不知道如何解决.在传递单个请求时,我可以毫无问题地向REST服务发出请求.

我现在的问题是基于该响应,我得到一些价值,包括ID.然后,检索到的所有ID都需要另外请求收集新信息.

我的猜测是在数组或字典中加载所有特定请求并从中创建请求.有人对此有一些有用的提示吗?然后,检索到的信息将填充UITableView.

Pey*_*loW 4

我建议您使用同步异步模式来解决这个问题。

\n\n

您需要实现两个同步方法:

\n\n
// Fetch the array of ID\'s\n-(NSArray*)fetchItemIDsWithError:(NSError**)error;\n\n// Fetch the item for a ID\n-(Item*)fetchItemForID:(NSString*)itemID error:(NSError**)error;\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用同步代码实现这些是简单且可测试的。您可以使用简单的方法,例如dataWithURL\xe2\x80\xa6,,stringWithContentsOfURL\xe2\x80\xa6sendSynchronousRequest\xe2\x80\xa6或 ASIHTTPrequest 等简单方法,并为此编写直接的单元测试。与并发代码通常的最终结果相比,该代码也将非常容易维护和扩展。

\n\n

现在到第二步,创建一个异步包装器,我将使用委托和方法签名,如下所示:

\n\n
@protocol FetchItemsDelegate <NSObject>\n-(void)didFetchItems:(NSArray*)array;\n-(void)failedFetchItemsWithError:(NSError*)error;\n@end\n\n-(void)fetchItemsWithAsyncDelegate:(id<FetchItemsDelegate>)delegate;\n
Run Code Online (Sandbox Code Playgroud)\n\n

您已经拥有了满足您需要的所有代码,因此您所要做的就是实现异步部分。这段代码将很好地分离并且直接。大概不超过这个:

\n\n
-(void)fetchItemsWithAsyncDelegate:(id<FetchItemsDelegate>)delegate;\n{\n    [self performSelectorInBackground:@selector(backgroundFetchItemsWithDelegate:)\n                           withObject:delegate];      \n}\n\n-(void)backgroundFetchItemsWithDelegate:(id<FetchItemsDelegate>)delegate;\n{\n    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];\n    BOOL success = YES;\n    NSMutableArray* items = [NSMutableArray array];\n    NSError* error = nil;\n    NSArray* itemIDs = [self fetchItemIDsWithError:&error];\n    if (itemIDs) {\n        for (NSString* itemID in itemIDs) {\n           Item* item = [self fetchItemForID:itemID\n                                       error:&error];\n           if (item) {\n               [items addObject:item];\n           } else {\n               success = NO;\n               break;\n           }\n        }\n    } else {\n        success = NO;\n    }\n    if (success) {\n        [delegate performSelectorOnMainThread:@selector(didFetchItems:)\n                                   withObject:[NSArray arraiWithArray:items]\n                                waitUntilDone:NO];\n    } else {\n        [delegate performSelectorOnMainThread:@selector(failedFetchItemsWithError)\n                                   withObject:error\n                                waitUntilDone:NO];\n    }\n    [pool release];\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我在这里写了一篇关于此主题的较长博客文章:http://blog.jayway.com/2011/04/28/sync-asyn-pair-pattern-easy-concurrency-on-ios/

\n