我想对远程服务器执行两个请求并异步获取和解析两个响应,但仍然阻塞主线程,直到两个进程都完成。
这是我在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
中解析响应,并且还希望对url2
和process2
执行相同的操作。
然而,虽然我想异步执行上面的这两个进程,但我还想等到两个完成每个工作才结束AppDelegate.m
的{{1}}方法,因为我的第一个错误发生了视图控制器(在AppDelegate.m之后),如果它在上述两次执行完成之前被初始化。
这很容易在一些语言中实现,比如Python或Go,我认为它也可以在Objective-C中的application: didLaunchingWithOptions:
中实现(虽然我没试过,如果不是这样的话,请原谅我) 。但是,我想在这种情况下使用NSURLConnection
,因为实际的会话配置比上面的代码复杂一点。
在NSURLSession
中使用同步功能是否可行?
答案 0 :(得分:1)
为什么要阻止主线程?这对用户不利,对你不利。
更改视图控制器以显示进度指示而不是崩溃。这可以使应用程序保持活动状态,并通知用户正在发生的事情。如果你想要,你可以有一个很好的动画供用户在等待时观看。
答案 1 :(得分:0)
阻止应用程序启动是一个坏主意,如果应用程序没有在launchTime< = 24秒内启动,它将使应用程序崩溃。如果您不在其中,则会杀死该应用。那么你应该做什么呢。使用您自己的加载器屏幕,直到您完成api解析。对于api解析,你可以尝试像queue一样的东西,所以在所有请求完成之前,加载器屏幕都会显示出来。
我希望它会给你一些想法。