1

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

在这一点上,我得到了未定义的结果。使用 NSLog(我在 XCode 调试方面并不先进),我发现它在访问 NSDictionary 时会爆炸。我尝试只是迭代字典并将键/值转储到 didStartElement 中,并且每次都会在不同的键处炸弹。

我唯一能得出的结论是,我在从辅助线程访问主线程属性方面所做的事情并不符合犹太教规。我对多线程有些陌生,并且不确定最好的协议是从其他线程安全访问属性。

谢谢大家。

4

2 回答 2

1

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

  1. 在单独的线程中处理所有字典访问(填充、实例化、查找等)
  2. 使用某种相当于线程安全字典的 iPhone:link
于 2010-03-08T16:55:17.460 回答
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/

于 2011-05-23T19:37:06.170 回答