我已经看到了一些使用带多个线程的委托来加载cocoa的URL加载系统的异步映像的例子。
我认为这个过程如下所示。
主题1: 为线程2提供要执行的操作,以及线程2在完成时将访问的委托。
主题2: 完成操作后,调用线程1传递的委托上的预定义选择器。
我想用我自己的类实现类似的功能(使用委托进行异步处理)。 下面的伪代码类似于上面概述的过程,但为了讨论线程安全,我想使它更详细。
线程1:
[开始批评部分]
设置委托,以便线程2可以访问
[最后批评部分]
开火行动
- (void)dealloc(委托对象的类)
{
[开始批评部分]
将委托设置为null
[最后批评部分]
}
线程2:
实际上是在操作上工作
- 完成后.. [开始批评部分]
得到代表
[委托performSelectorOnMainThread @someSelector];
[end critical seciton]
现在,我担心访问委托的线程安全性。 换句话说,当委托对象可以随时离开而不等待操作完成时,第二个线程如何确保委托仍然有效。
上面的伪代码是我做过的最好的尝试,并想知道它是否真的有效。 此外,我从未见过任何尝试在类似的工作中使委托线程安全,例如http://www.markj.net/iphone-asynchronous-table-image/ 关键部分不是安全防护所必需的吗?
由于
答案 0 :(得分:1)
NSURLConnection在辅助线程上加载数据,但只调用主线程上的委托方法,因此从使用NSURLConnection数据的角度来看,您不必担心线程安全。在NSURLConnection内部进行了处理。
如果委托仍然有效,您可能只想保留对URL连接的引用,并在取消分配控制对象时取消任何挂起或正在进行的连接。
- (void)取消NSURLConnection状态:
“调用此方法后,接收方的委托将不再收到此NSURLConnection的任何消息。”
答案 1 :(得分:1)
您可以让工作人员保留其回调目标。然后,它保证在它进行回调时。这就是NSTimer
的作用。