从次线程访问实例属性(iPhone-SDK)
Posted
技术标签:
【中文标题】从次线程访问实例属性(iPhone-SDK)【英文标题】:Accessing Instance Attributes from Secondary Thread (iPhone-SDK) 【发布时间】:2010-03-08 06:46:18 【问题描述】:我有一个具有 NSDictionary 属性的类。在这个类中,我调度另一个线程来处理 NSXMLParser 处理。在我的 -didStartElement 中,我访问类中的字典(将 XML 中的元素与字典中的元素进行比较)。
此时我得到未定义的结果。使用 NSLog(我在 XCode 调试方面并不先进),我发现它在访问 NSDictionary 时会爆炸。我尝试只是迭代字典并将键/值转储到 didStartElement 中,并且每次都会在不同的键处炸弹。
我唯一能得出的结论是,在从辅助线程访问主线程属性方面,我正在做的事情并不符合犹太教规。我对多线程有些陌生,不确定什么是从其他线程安全访问属性的最佳协议。
谢谢大家。
【问题讨论】:
【参考方案1】:如果您可以访问另一个线程中的一个线程使用的内存,我会感到惊讶,除非该字典是静态/全局的。我会采取两种方法之一,不知道 iPhone SDK 的复杂性 -
-
在单独的线程中处理所有字典访问(填充、实例化、查找等)
使用某种相当于线程安全字典的 iPhone:link
【讨论】:
【参考方案2】:在 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/
【讨论】:
以上是关于从次线程访问实例属性(iPhone-SDK)的主要内容,如果未能解决你的问题,请参考以下文章
获取 NSManagedObject 实例的上下文是不是是线程安全的?
Class PLBuildVersion is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/iPh