在iPhone应用程序初始化时进行多个服务调用
我需要在应用程序中进行多个异步服务调用:来自我的应用程序委托的didFinishLaunchingWithOptions:方法,以便从应用程序中的各种控制器中检索一些服务中的某些数据。我已经控制了服务,并且我设计的API尽可能地为RESTful,所以我需要在应用程序初始化期间进行多次调用。在iPhone应用程序初始化时进行多个服务调用
我想要做的是显示带有进度指示器的加载视图 - 类似于Default.png的默认启动画面 - 并在服务调用完成后移除该视图,并获得我需要的初始值。如果只有一个服务调用,这很容易实现,因为我可以通过隐藏加载视图并显示根控制器来简单地将该逻辑挂接到NSURLConnection的connectionDidFinishLoading:delegate方法。
但是,对于多个服务调用,它变得棘手。我可以将所有内容“链接”在一起,发出一个请求,等待它完成/失败,然后发出第二个请求,等等直到我接到最后一个请求。在最后的请求中,我隐藏加载视图并显示普通视图。但是,这可能会在多个服务调用中变得笨拙,代码变得难以理解和遵循。
有关最佳方法的任何建议吗?
我在想一个解决方案是有一个singleton类负责进行服务调用和应用程序初始化。单例对象将在启动时并行触发所有必要的请求,并且每个失败/完成回调将检查每个请求是否已完成。如果所有请求都已完成,那么它可以调用应用程序委托中的某些方法并告诉它隐藏加载视图,显示根控制器等。
想法?
另一种可能性是让每个服务完成回调通知(NSNotification)进度指示器的控制器已经取得进展。你也可以告诉控制器你有多少要求的进度指示器,并让它保持得分,当它认为一切都完成时,它本身会进行回调。
我正在做一些类似于NSOperationQueue
的配置,该配置一次只运行1次操作。参见例如WeaveEngine.m和它的synchronizewithServer:credentials:
方法。我将所有单独的操作排队,这些操作大多数是异步网络调用。
你可以使用NSThreading,并在每个东西单独的线程同步调用,你需要得到像
[NSThread detachNewThreadSelector:@selector(getDataRequest1:) toTarget:self withObject:urlRequest];
[NSThread detachNewThreadSelector:@selector(getDataRequest2:) toTarget:self withObject:urlRequest];
[NSThread detachNewThreadSelector:@selector(getDataRequest3:) toTarget:self withObject:urlRequest];
然后选择为每个线程做这样的事情
- (void) getDataRequest1:(NSURLRequest*)urlRequest {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSHTTPURLResponse *urlResponse;
NSError *error;
NSData *responseData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&urlResponse error:&error];
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
if ([urlResponse statusCode] < 200 || [urlResponse statusCode] > 299) {
//request probably failed
}else{
[self performSelectorOnMainThread:@selector(completeRequest1:) withObject:responseData waitUntilDone:NO];
}
[pool drain];
[responseString release];
[urlRequest release];
}
当然
它真的取决于你想要产生多少个请求/线程。 ,你将需要跟踪你产卵的次数和完成次数,以便你可以正确地停止你的微调。
通过这种方式,您可以一次启动所有服务请求,而不是通过序列化来减慢速度。 – hotpaw2 2010-09-02 23:49:28
谢谢。这或多或少是我采用的方法,因为我只有几个请求,只需要一个轻量级的解决方案。完成的每个请求都会通知主对象请求已完成,并且主对象将在加载主应用程序视图之前检查是否所有必需的请求都已完成。 – pmc255 2010-09-08 06:36:18