我正在编写一个应用程序,它会生成大量的http请求,然后解析它们的JSON响应。
我想异步解析JSON,以避免阻止用户界面。 解析后,应根据收到的JSON更改模型。 我的ViewControllers是键值 - 观察我的模型类,以便立即刷新。
我的问题是:解析JSON并在后台线程中更改我的模型是否安全?当模型更改时,将触发UI更新。我真的很想避免使用锁,因为它对我来说太复杂了。我的解决方案安全吗?关于如何异步解析并安全地更改模型而不使用线程的任何想法?
答案 0 :(得分:1)
您不必编写自己的锁。只需在模型中使用原子属性,即可进行线程安全。
答案 1 :(得分:1)
此链接Working with json in ios 5 肯定会帮助您
答案 2 :(得分:0)
原子属性不是线程安全的! Objective-C: Atomic, properties, threading and/or custom setter/getter 并从the documentation:
默认情况下,属性是原子的,因此合成访问器提供对多线程环境中属性的强大访问 - 也就是说,无论其他线程同时执行什么,始终完全检索或设置从getter返回的值或通过setter设置的值。
这并不意味着它们是线程安全的。
Concurrency Programming Guide显示了如何实现不同类型的锁。
但是为了回答关于你的问题,可以安全地解析json并在后台更新你的模型:是的,确实如此。但是,应该为访问模型对象的其余代码做好准备。如果您正在处理合并通知,那么您应该很好,特别是如果您的应用程序使用获取的结果控制器。如果您的UI不是由获取的结果控制器驱动的,请让您的视图控制器侦听相应的NSManagedObjectContext通知(即NSManagedObjectContextObjectsDidChangeNotification)并相应地执行操作。您可以使用它来查看插入,更新等对象的时间,然后通过它的objectID重新获取对象来刷新视图控制器。 因此,当您在后台进行json解析更新模型对象时,您将获得合并通知并合并到主线程的对象上下文中。然后,您的视图控制器将看到他们正在侦听的通知中的更改,以及繁荣,神奇更新的UI。