NSURLSession - 执行两个请求并解析两个响应,但仍然阻止主线程

时间:2014-02-22 10:55:48

标签: ios objective-c nsurlconnection nsurlsession

我想对远程服务器执行两个请求并异步获取和解析两个响应,但仍然阻塞主线程,直到两个进程都完成。

这是我在AppDelegate.m的application: didFinishLaunchingWithOptions:方法中的代码:


    NSURL *url1 = [NSURL URLWithString: @"url1"];
    NSURL *url2 = [NSURL URLWithString:@"url2"];
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task1 = [session dataTaskWithURL:url1 completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
//process1
    }];
    [task1 resume];

    NSURLSessionDataTask *task2 = [session dataTaskWithURL:url2 completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        //process2
    }];
    [task2 resume];

在此代码中,我想从url1获取数据并在process1中解析响应,并且还希望对url2process2执行相同的操作。

然而,虽然我想异步执行上面的这两个进程,但我还想等到两个完成每个工作才结束AppDelegate.m的{​​{1}}方法,因为我的第一个错误发生了视图控制器(在AppDelegate.m之后),如果它在上述两次执行完成之前被初始化。

这很容易在一些语言中实现,比如Python或Go,我认为它也可以在Objective-C中的application: didLaunchingWithOptions:中实现(虽然我没试过,如果不是这样的话,请原谅我) 。但是,我想在这种情况下使用NSURLConnection,因为实际的会话配置比上面的代码复杂一点。

NSURLSession中使用同步功能是否可行?

2 个答案:

答案 0 :(得分:1)

为什么要阻止主线程?这对用户不利,对你不利。

更改视图控制器以显示进度指示而不是崩溃。这可以使应用程序保持活动状态,并通知用户正在发生的事情。如果你想要,你可以有一个很好的动画供用户在等待时观看。

答案 1 :(得分:0)

阻止应用程序启动是一个坏主意,如果应用程序没有在launchTime< = 24秒内启动,它将使应用程序崩溃。如果您不在其中,则会杀死该应用。那么你应该做什么呢。使用您自己的加载器屏幕,直到您完成api解析。对于api解析,你可以尝试像queue一样的东西,所以在所有请求完成之前,加载器屏幕都会显示出来。

我希望它会给你一些想法。