【问题标题】:Accessing Instance Attributes from Secondary Thread (iPhone-SDK)从次线程访问实例属性(iPhone-SDK)
【发布时间】:2010-03-08 06:46:18
【问题描述】:

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

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

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

谢谢大家。

【问题讨论】:

    标签: iphone nsdictionary nsthread


    【解决方案1】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-10
        • 2018-12-08
        • 1970-01-01
        • 1970-01-01
        • 2021-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多