5

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

我现在的问题是根据该负责人我得到一些价值观,包括ID。所有检索到的ID都需要另外收集新的信息。

我的猜测是加载数组或字典中的所有特定请求,并从中创建请求。任何人都有关于此的一些有用的提示检索到的信息将填充UITableView。

+0

你的要求是这样的。 req ---> response(用于另一个req并存储一些信息) - > response(再次提出新的请求并存储/使用一些信息)---> response ..等等? – Ravin 2011-05-13 13:04:33

+0

是的,但问题是第一个请求在一个请求中检索到我需要的所有内容。例如,我回来了20人,每个人都有一个ID。我想取每个ID并提出20个请求来为每个ID取回一个时间表。棘手的是,第一个响应使用名称填充UITableView。每个名字后我想把他们的个人日程安排。我不知道这使我的问题更清楚。 – Silversnail 2011-05-13 13:11:56

回答

4

我建议你在这个问题上使用同步异步模式。

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

// 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/

+0

@PeyloW感谢您的回答!我会试一试。我对Objective-C来说很新,所以如果我现在有一个单独的类来检索第一个响应来填充ID的数组,我可以为这些方法创建一个新的类吗?另一个类对我的viewController进行回调,然后填充TableView。 – Silversnail 2011-05-13 13:33:09

+0

@Silversnail - 我是智能模型对象的支持者。所以,如果这取决于我,我会在'Item'类本身上将方法添加为类方法。也许在分离类别中,在相同的头文件中,但如果文件增长到500行或更多,可以选择在单独的实现文件中。 – PeyloW 2011-05-13 13:38:08

+0

@PeyloW,我想我也许是点点雏让我将如何得到这一切在一起,我就看看你的博客获得一些更多的了解。这就是我现在有我的异步连接... stackoverflow.com/questions/5975825/debugger-message – Silversnail 2011-05-13 13:47:33

0

你的问题有点含糊,但我想我可能会理解你的问题。我做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: 

你的控制器实施。

0

它的解决方案取决于您现有的实现(我在这里只考虑两种情况。)

案例一If you are having a different class for managing connection related task, a separate class that has NSURLConnection Delegate methods.(Asynchronous..)

  • 您将需要运行一个for循环,要求所有日e 20 ID请求,为他们注册通知,ID为通知的名称。当连接完成它的加载时,它会发布一个通知给你的观察班,在这里使用通知的名字,你可以更新各自ID的相关时间表。 [在这里,您将需要该连接处理程序类的创建不同的对象] ...在这里,你将需要等待时间表载你能做什么,你可以把一个活动的指标细胞的附属视图,直到时间表被加载。(你可以显示在这种情况下,名称)

案例二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.

  • 您将需要一个发送请求和一个更新单元格的内容,直到它完成。这意味着你发送ID 1的请求,当它的响应到来时,你可以更新单元并发送下一个请求。等等。

如果您发布我们你是如何处理连接活动这会有所帮助。

谢谢,

+0

这是我如何做连接的结构。 http://stackoverflow.com/questions/5975825/debugger-message – Silversnail 2011-05-13 13:36:07

+0

所以在你的单元格你有一些看法你的日程安排显示,UILabel或类似的东西? – Ravin 2011-05-13 13:53:43

+0

是的! UIlabel – Silversnail 2011-05-13 13:56:12