我有一个具有各种属性的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]
在过去,但我想要的是要锁定的位置数组,但可以从主线程访问用户对象的其余方法和属性。实现这一目标的最佳方法是什么?
答案 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}}
位置。