可变集合的键值编码&原子访问器

时间:2010-09-14 14:54:27

标签: objective-c cocoa

我的问题,简而言之:有没有办法使用@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方法以保证所有访问者的完全原子性?

2 个答案:

答案 0 :(得分:3)

developer.apple.com [1]上的Objective-C文档没有说明有一种方法可以为明确定义的函数使用相同的锁,就像用于@synthesized函数的函数一样。在这种情况下,我会说完全安全,最好完全定义自己的函数,以确保它们都使用相同的锁。

您可以使用调试器来确定用于@synthesized函数的锁的名称,但这不是我所依赖的。

答案 1 :(得分:0)

你可能真的不想这样做。如果您成功,将在进行更改的同一线程上收到KVO通知,如果它是后台线程,则不适合更新UI。

相反,为什么不让你的后台线程使用主线程更新属性?那么你甚至不需要该属性是原子的。