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

时间:2013-07-31 17:06:35

标签: iphone ios objective-c

我有一个具有各种属性的User类:

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

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

@property (strong, nonatomic) User *user;

此用户可以传递给以模态方式启动的后续ViewControllers。

首次初始化用户对象时,我将在盛大中央调度中发送一些方法,通过REST填充位置数组。这个想法是,当有人使用我的应用程序进入屏幕选择位置时,列表将已经下载。

我想要做的是在gcd使用时锁定位置区域,我使用了类似的东西

[someLock lock] ... [someLock unlock]

在过去,但我想要的是要锁定的位置数组,但可以从主线程访问用户对象的其余方法和属性。实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:4)

我会将后台线程中的位置提取到单独的数组中,并且只分配 在数据完成时向用户提供,例如:

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或包含已获取的{{1}} 位置。