使用GCD时,locking对象的NSMutableArray,但不locking对象的其余部分

我有一个用户类具有不同的属性:

@property (strong, nonatomic) NSString *CandID; @property (assign, nonatomic) BOOL IsCandidate; @property (assign, nonatomic) NSInteger ResponseCode; @property (strong, nonatomic) NSMutableArray *locations; 

等等

我的一个ViewController可能有一个用户属性即

 @property (strong, nonatomic) User *user; 

而且这个用户可能会被传递到随后以模态方式启动的ViewController。

当用户对象第一次初始化时,我将发送一些关于中央调度的方法,通过REST来填充位置数组。 这个想法是,当有人使用我的应用程序到屏幕上select一个位置时,该列表已经被下载。

我想要做的就是当gcd使用它时locking位置区域,我已经使用了类似的东西

 [someLock lock] ... [someLock unlock] 

在过去,但我想要的是要locking位置数组,但其余的用户对象的方法和属性可以从主线程访问。 达到这个目标的最好方法是什么?

我会将后台线程中的位置提取到一个单独的数组中,并且只在数据完成时才将其分配给用户,如下所示:

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSMutableArray *locations; // ... fill locations ... dispatch_sync(dispatch_get_main_queue(), ^{ user.locations = locations; // ... perhaps refresh some view or send a notification ... }) }); 

然后, user.locations总是可以在主线程中访问,并且可以是nil或包含提取的位置。