NSURLConnection 委托方法是否在主线程上调用?
委托方法可以在一个NSOperationQueue
或一个线程上执行。如果您没有明确安排连接,它将使用接收start
消息的线程。这可以是主线程,但也可以是任何其他也应具有运行循环的辅助线程。
您可以使用方法(间接)设置线程
- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode
它设置您从当前线程检索的运行循环。运行循环以 1:1 的关系与线程相关联。也就是说,为了设置要执行委托方法的某个线程,您需要在该线程上执行,从当前线程中检索 Run Loop 并将 scheduleInRunLoop:forMode: 发送到连接。
设置一个专用的辅助线程需要,该线程将有一个运行循环。确保这并不总是直截了当,需要“破解”。
或者,您可以使用方法
- (void)setDelegateQueue:(NSOperationQueue *)queue
为了设置将执行委托方法的队列。然后不确定哪个线程将实际用于执行委托。
你不能同时使用这两种方法——所以安排在一个线程或一个队列上。请查阅文档以获取更多信息。
委托方法中的非原子数据是否容易受到攻击?
您应该始终同步对共享资源的访问——即使是整数。在某些多处理器系统上,甚至不能保证对共享整数的访问是安全的。为了保证这一点,您必须在两个线程上使用内存屏障。
您可以利用串行队列(NSOperationQueue
或者调度队列)来保证对共享资源的安全访问。
在处理复杂的线程应用程序时,从 Web 获取数据的最佳实践是什么?
如前所述,利用队列,那么您不必处理线程。“抓取数据”不仅是线程问题;)
如果您更喜欢更具体的答案,则需要更详细地描述您的问题。