Ios 是否在主线程上调用NSURLSessionDataTask完成块?
我一直在试图弄清楚什么时候可以“只输入我需要做的”,什么时候我需要具体说明我在什么样的线程上做什么样的工作 据我所知,我应该只更新主线程上的UI。这是否意味着这样做是不好的?我应该把这个放到GDC电话里吗Ios 是否在主线程上调用NSURLSessionDataTask完成块?,ios,objective-c,multithreading,Ios,Objective C,Multithreading,我一直在试图弄清楚什么时候可以“只输入我需要做的”,什么时候我需要具体说明我在什么样的线程上做什么样的工作 据我所知,我应该只更新主线程上的UI。这是否意味着这样做是不好的?我应该把这个放到GDC电话里吗 [sessionManager dataTaskWithRequest:aRequest completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullab
[sessionManager dataTaskWithRequest:aRequest completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
someUILabel.text = @"Hello!"; // Updating my UI
[someTableView reloadData]; // Ask a table view to reload data
}];
这就是UI部分。现在,假设我的类中有一个NSMutableArray
。我将通过点击ui按钮
向该数组添加或删除对象。然后我又有一个NSURLSessionDataTask
去某个服务器获取一些数据并将其加载到我的NSMutableArray
,如下所示:
[sessionManager dataTaskWithRequest:aRequest completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
myMutableArray = [[responseObject objectForKey:@"results"] mutableCopy];
}];
这不是一个UI操作。当完成块运行时,是否需要将其包装在GDC调用中,以避免在我的按钮点击添加对象(即[myMutableArray insertObject:someObj atIndex:4];
)之间的竞争条件下崩溃,还是设计为不会相互冲突
我省略了所有的错误处理来关注手头的问题。TLDR:在完成处理程序中调用
dispatch\u async(dispatch\u get\u main\u queue()…
,无需花费任何费用,所以只需执行即可
长答案:
让我们看一下文件,好吗
completionHandler
加载请求完成时要调用的完成处理程序。此处理程序在委托队列上执行
委托队列是您在使用sessionWithConfiguration:delegateQueue:
创建NSURLSession时传入的队列。如果您不是这样创建此NSURLSession的,那么我建议您不要对调用完成处理程序的队列做任何假设。如果您没有通过[NSOperationQueue mainQueue]
作为此参数,您处于后台队列中,在执行任何非线程安全的操作之前,应先进入主队列
所以现在的问题是:
- 更新UI并与表视图对话是否是线程安全的?否,必须仅在主队列上执行这些操作
- 设置
是否对线程安全?否,因为您将在两个线程之间共享一个属性myMutableArray
(主队列,您通常在其中与此属性对话,以及此队列,无论它是什么)self.myMutableArray
dispatch\u async(dispatch\u get\u main\u queue()…
,无需任何费用,所以只需执行即可
长答案:
让我们看一下文件,好吗
completionHandler
加载请求完成时要调用的完成处理程序。此处理程序在委托队列上执行
委托队列是您在使用sessionWithConfiguration:delegateQueue:
创建NSURLSession时传入的队列。如果您不是这样创建此NSURLSession的,那么我建议您不要对调用完成处理程序的队列做任何假设。如果您没有通过[NSOperationQueue mainQueue]
作为此参数,您处于后台队列中,在执行任何非线程安全的操作之前,应先进入主队列
所以现在的问题是:
- 更新UI并与表视图对话是否是线程安全的?否,必须仅在主队列上执行这些操作
- 设置
是否对线程安全?否,因为您将在两个线程之间共享一个属性myMutableArray
(主队列,您通常在其中与此属性对话,以及此队列,无论它是什么)self.myMutableArray