我有一个问题,我不知道如何解决。在传递单个请求时,我可以毫无问题地向REST服务发出请求。多个异步web服务请求NSURLConnection iOS
我现在的问题是根据该负责人我得到一些价值观,包括ID。所有检索到的ID都需要另外收集新的信息。
我的猜测是加载数组或字典中的所有特定请求,并从中创建请求。任何人都有关于此的一些有用的提示检索到的信息将填充UITableView。
我有一个问题,我不知道如何解决。在传递单个请求时,我可以毫无问题地向REST服务发出请求。多个异步web服务请求NSURLConnection iOS
我现在的问题是根据该负责人我得到一些价值观,包括ID。所有检索到的ID都需要另外收集新的信息。
我的猜测是加载数组或字典中的所有特定请求,并从中创建请求。任何人都有关于此的一些有用的提示检索到的信息将填充UITableView。
我建议你在这个问题上使用同步异步模式。
你需要实现两个同步方法:
// Fetch the array of ID's
-(NSArray*)fetchItemIDsWithError:(NSError**)error;
// Fetch the item for a ID
-(Item*)fetchItemForID:(NSString*)itemID error:(NSError**)error;
实现这些使用同步代码是很简单的测试。您可以轻松使用简单的方法,如dataWithURL…
,stringWithContentsOfURL…
,sendSynchronousRequest…
或ASIHTTPrequest,并为此编写直接的单元测试。代码也将非常容易维护和扩展,与并发代码通常如何结束相比。
我们第二步,创建一个异步包装,我会用这样的委托和方法签名:
@protocol FetchItemsDelegate <NSObject>
-(void)didFetchItems:(NSArray*)array;
-(void)failedFetchItemsWithError:(NSError*)error;
@end
-(void)fetchItemsWithAsyncDelegate:(id<FetchItemsDelegate>)delegate;
你已经拥有一切你所需要的代码,所以你必须做什么是推动异步的部分。此代码将很好地分离和直接。 Probaly没有比这更:
-(void)fetchItemsWithAsyncDelegate:(id<FetchItemsDelegate>)delegate;
{
[self performSelectorInBackground:@selector(backgroundFetchItemsWithDelegate:)
withObject:delegate];
}
-(void)backgroundFetchItemsWithDelegate:(id<FetchItemsDelegate>)delegate;
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
BOOL success = YES;
NSMutableArray* items = [NSMutableArray array];
NSError* error = nil;
NSArray* itemIDs = [self fetchItemIDsWithError:&error];
if (itemIDs) {
for (NSString* itemID in itemIDs) {
Item* item = [self fetchItemForID:itemID
error:&error];
if (item) {
[items addObject:item];
} else {
success = NO;
break;
}
}
} else {
success = NO;
}
if (success) {
[delegate performSelectorOnMainThread:@selector(didFetchItems:)
withObject:[NSArray arraiWithArray:items]
waitUntilDone:NO];
} else {
[delegate performSelectorOnMainThread:@selector(failedFetchItemsWithError)
withObject:error
waitUntilDone:NO];
}
[pool release];
}
我已经写了关于这一主题在这里更长的博客文章:http://blog.jayway.com/2011/04/28/sync-asyn-pair-pattern-easy-concurrency-on-ios/
@PeyloW感谢您的回答!我会试一试。我对Objective-C来说很新,所以如果我现在有一个单独的类来检索第一个响应来填充ID的数组,我可以为这些方法创建一个新的类吗?另一个类对我的viewController进行回调,然后填充TableView。 – Silversnail 2011-05-13 13:33:09
@Silversnail - 我是智能模型对象的支持者。所以,如果这取决于我,我会在'Item'类本身上将方法添加为类方法。也许在分离类别中,在相同的头文件中,但如果文件增长到500行或更多,可以选择在单独的实现文件中。 – PeyloW 2011-05-13 13:38:08
@PeyloW,我想我也许是点点雏让我将如何得到这一切在一起,我就看看你的博客获得一些更多的了解。这就是我现在有我的异步连接... stackoverflow.com/questions/5975825/debugger-message – Silversnail 2011-05-13 13:47:33
你的问题有点含糊,但我想我可能会理解你的问题。我做http请求时,通常实施用的协议的委托模式:
@protocol HttpDelegate
-(void) httpDidFinish;
-(void) httpError:(NSError *) error;
@end
并在HttpClient的类:
-(void) connectionDidFinishLoading:(NSURLConnection *)connection {
[self.delegate httpDidFinish];
}
您控制器(或其他类)实现HttpDelegate和httpDidFinish要么使所述第二请求或填充你的表格。在这种情况下,因为这是一个两步过程,所以我可能会添加另一个类TwoStepProcessor和TwoStepProcessorDelegate,而不是在控制器中实现HttpDelegate。 TwoStepProcessorDelegate就像HttpDelegate除了它具有:
-(void) secondStepFinished:
你的控制器实施。
它的解决方案取决于您现有的实现(我在这里只考虑两种情况。)
案例一:If you are having a different class for managing connection related task, a separate class that has NSURLConnection Delegate methods.(Asynchronous..)
案例二:If its singleton or in the same class which you are using.(we can not create it's multiple objects)..(it will have the performance cost.) one by one request.
如果您发布我们你是如何处理连接活动这会有所帮助。
谢谢,
这是我如何做连接的结构。 http://stackoverflow.com/questions/5975825/debugger-message – Silversnail 2011-05-13 13:36:07
所以在你的单元格你有一些看法你的日程安排显示,UILabel或类似的东西? – Ravin 2011-05-13 13:53:43
是的! UIlabel – Silversnail 2011-05-13 13:56:12
你的要求是这样的。 req ---> response(用于另一个req并存储一些信息) - > response(再次提出新的请求并存储/使用一些信息)---> response ..等等? – Ravin 2011-05-13 13:04:33
是的,但问题是第一个请求在一个请求中检索到我需要的所有内容。例如,我回来了20人,每个人都有一个ID。我想取每个ID并提出20个请求来为每个ID取回一个时间表。棘手的是,第一个响应使用名称填充UITableView。每个名字后我想把他们的个人日程安排。我不知道这使我的问题更清楚。 – Silversnail 2011-05-13 13:11:56