0

我需要在应用程序中进行多个异步服务调用:didFinishLaunchingWithOptions:来自我的应用程序委托的方法,以便从服务中检索一些数据,以便在我的应用程序中的各种控制器中使用。我可以控制服务,并且我将 API 设计为尽可能 RESTful,因此我需要在应用程序初始化期间进行多次调用。

我想要做的是显示一个带有进度指示器的加载视图 - 类似于 Default.png 中的默认启动屏幕 - 并在服务调用完成并且我有我需要的初始值后删除该视图。如果只有一个服务调用,这很容易做到,因为我可以简单地将该逻辑挂钩到 NSURLConnection 的 connectionDidFinishLoading: 委托方法中,方法是隐藏加载视图并显示根控制器。

但是,对于多个服务调用,它变得很棘手。我可以将所有内容“链接”在一起并触发一个请求,等待它完成/失败,然后触发第二个请求,依此类推,直到我到达最后一个请求。在最后一个请求中,然后我隐藏加载视图并显示普通视图。但是,这可能会因多次服务调用而变得笨拙,并且代码变得难以理解和遵循。

关于此最佳方法的任何建议?

我在想一种解决方案是让一个单例类负责进​​行服务调用和应用程序初始化。单例对象将在启动时并行触发所有必要的请求,并且每个失败/完成回调将检查每个请求是否已完成。如果所有请求都已完成,那么它可以调用应用程序委托中的某个方法并告诉它隐藏加载视图、显示根控制器等。

想法?

4

3 回答 3

0

另一种可能性是让每个服务完成回调通知(NSNotification)进度指示器的控制器已经取得了进展。您还可以告诉进度指示器的控制器您计划发出多少请求,并让它记分,当它认为一切都完成时,它自己会进行回调。

于 2010-09-02T22:16:15.427 回答
0

我正在做类似的事情NSOperationQueue,配置为一次只运行 1 个操作。参见例如WeaveEngine.m及其synchronizewithServer:credentials:方法。我将所有单独的操作排队,这些操作主要是异步网络调用。

于 2010-09-02T22:23:39.440 回答
0

您可以使用 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];   
}

当然,这实际上取决于您想要产生多少请求/线程。并且您将需要跟踪生成的数量与完成的数量,以便正确停止微调器。

于 2010-09-02T23:20:32.940 回答