从辅助线程访问实例属性(iPhone-SDK)

时间:2010-03-08 06:46:19

标签: iphone nsdictionary nsthread

我有一个带有NSDictionary属性的类。在这个类中,我调度另一个线程来处理NSXMLParser。在我的-didStartElement中,我访问类中的字典(将XML中找到的元素与字典中的元素进行比较)。

此时我得到了未定义的结果。使用NSLog(我在XCode调试中没有进展),我看到它围绕NSDictionary的访问进行了轰炸。我试着迭代字典并将关键/值转储到didStartElement中,并且每次都会在不同的键上进行此炸弹。

我唯一可以得出的结论是,关于从辅助线程访问主线程属性,我正在做的事情不是犹太教。我对多线程有些新意,并且不确定最佳协议是什么安全地从其他线程访问属性。

谢谢大家。

2 个答案:

答案 0 :(得分:1)

如果您可以访问另一个线程中的一个线程使用的内存,我会感到惊讶,除非该字典是静态/全局的。我会采用两种方法中的一种,不知道iPhone SDK的复杂性 -

  1. 处理单独线程中的所有字典访问(填充,实例化,查找等)
  2. 使用某种类似于线程安全字典的iPhone:link

答案 1 :(得分:1)

在Objective-C中启用对实例变量的线程安全访问的方法很少。最简单的方法是将@property声明定义为原子。在这种情况下,自动生成的setter和getter将在self上同步。

另一种方法是将关键代码包装在@synchronized块中。

最优选的方法是创建一个NSOperation子类来处理提取和解析,并通过委托或块(如果你是> = iOS4.0)提供回调,以通知你的消费者操作已经完成。

并发NSOperations需要一些样板代码才能使它们正常工作,请参阅此示例(示例适用于Snow Leopard,但概念是相同的):http://www.dribin.org/dave/blog/archives/2009/05/05/concurrent_operations/