我正在请求需要一些时间来提供响应的API,因此在此期间不能执行其他操作。例如后退按钮或Tabs未按下。我正在使用以下代码:
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];
NSURL * url = [NSURL URLWithString:urlString];
NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithURL:url
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if(error == nil)
{
}else{
}
}];
[dataTask resume];
任何人都可以建议我的应用程序在此操作期间冻结的原因。提前谢谢。
答案 0 :(得分:0)
因为您正在主线程中执行操作,所以您需要在后台线程中执行此任务。
为此你可以使用NSOperationQueue并添加你api调用的操作。
参见belo链接
NSOperation and NSOperationQueue working thread vs main thread
How To Use NSOperations and NSOperationQueues
Working with the NSOperationQueue Class
或者您也可以使用DispatchQueue
请参阅:Multithreading and Grand Central Dispatch on iOS for Beginners Tutorial
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// simply call your function here
});
答案 1 :(得分:0)
你正在主线程swhich中断app执行操作。你应该通过GCD在后台通过创建异步请求在后台下载数据来执行此操作,它不会中断你的应用程序执行。
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(concurrentQueue, ^{
NSURL * url = [NSURL URLWithString:urlString];
NSData *response = [[NSData alloc] initWithContentsOfURL:url];
// above code will download data in background
dispatch_async(dispatch_get_main_queue(), ^{
// here you can access main thread of application and do something here
});
});