我的问题,简而言之:有没有办法使用@synthesized方法被锁定的同一个锁来使可变集合KVO访问器线程安全?
说明:我有一个控制器类,其中包含Post
个对象的集合(NSMutableArray)。这些对象是从网站下载的,因此集合会不时更改。我希望能够使用键值观察来观察数组,以便我可以更新我的界面。
我的控制器有一个posts
属性,声明如下:
@property (retain) NSMutableArray *posts;
如果我在.m文件中调用@synthesize,它将为我创建-(NSMutableArray *)posts
和-(void)setPosts:(NSMutableArray *)obj
方法。此外,它们将受到锁的保护,使得两个线程在设置(或获取)值时不会相互踩踏。
但是,为了使密钥值编码符合可变有序集合,我还需要实现其他一些方法。具体来说,我需要实现at least the following:
-insertObject:inPostsAtIndex:
-removeObjectFromPostsAtIndex:
但是,由于帖子是异步下载的,我希望能够在后台线程上将新帖子插入到数组中。这意味着访问需要是线程安全的。
所以,我的问题。是否有任何方法可以使用@synthesized方法锁定的相同锁定使这些访问器线程安全?或者我是否必须自己指定setPosts:
和posts
方法以保证所有访问者的完全原子性?
答案 0 :(得分:3)
developer.apple.com [1]上的Objective-C文档没有说明有一种方法可以为明确定义的函数使用相同的锁,就像用于@synthesized函数的函数一样。在这种情况下,我会说完全安全,最好完全定义自己的函数,以确保它们都使用相同的锁。
您可以使用调试器来确定用于@synthesized函数的锁的名称,但这不是我所依赖的。
答案 1 :(得分:0)
你可能真的不想这样做。如果您成功,将在进行更改的同一线程上收到KVO通知,如果它是后台线程,则不适合更新UI。
相反,为什么不让你的后台线程使用主线程更新属性?那么你甚至不需要该属性是原子的。