如何确保您的委托(iphone,cocoa)是线程安全的?

时间:2010-10-29 02:14:18

标签: iphone multithreading delegates

我已经看到了一些使用带多个线程的委托来加载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/ 关键部分不是安全防护所必需的吗?

由于

2 个答案:

答案 0 :(得分:1)

NSURLConnection在辅助线程上加载数据,但只调用主线程上的委托方法,因此从使用NSURLConnection数据的角度来看,您不必担心线程安全。在NSURLConnection内部进行了处理。

如果委托仍然有效,您可能只想保留对URL连接的引用,并在取消分配控制对象时取消任何挂起或正在进行的连接。

- (void)取消NSURLConnection状态:

“调用此方法后,接收方的委托将不再收到此NSURLConnection的任何消息。”

答案 1 :(得分:1)

您可以让工作人员保留其回调目标。然后,它保证在它进行回调时。这就是NSTimer的作用。