我使用以下代码来设置一个属性,该属性在一个核心数据记录中保存有关twitter速率限制的信息:
- (Limits *)limits
{
if (!_limits) {
[[[TwitterManager sharedManager] API] getRateLimitsForResources:nil successBlock:^(NSDictionary *rateLimits) {
_limits = [Limits createWithInfo:rateLimits user:_user];
} errorBlock:^(NSError *error) {
NSLog(@"Error %s: %@", __PRETTY_FUNCTION__, error);
}];
}
return _limits;
}当它到达最后一行时,它不会反映新值,因为块还没有完成。我该怎么做才是最好的呢?
发布于 2014-03-02 19:28:18
像这样混合同步和异步代码是相当困难的。进行此操作的最佳方法是使您的limits方法异步,并让它接受一个完成块:
- (void)getLimits: (void (^)( Limits *limits ))block
{
if (_limits) {
block( _limits );
} else {
[[[TwitterManager sharedManager] API] getRateLimitsForResources:nil successBlock:^(NSDictionary *rateLimits) {
_limits = [Limits createWithInfo:rateLimits user:_user];
block( _limits );
} errorBlock:^(NSError *error) {
NSLog(@"Error %s: %@", __PRETTY_FUNCTION__, error);
block( nil );
}];
}
}如果你想在主线程上调用limits方法,你真的应该使用这个选项。阻塞网络访问的主线程不会带来很好的用户体验,如果请求花费的时间太长,可能会让您的应用程序被监视程序终止。
如果这不是一个选项,那么您基本上必须等待请求完成。要做到这一点,最简单的方法是使用同步方法,如果您的TwitterManager支持的话。如果不是,则有不同的方法来处理此问题,具体取决于TwitterManager类的实现方式。
如果所有线程都运行在不同的线程上,那么只需使用分派组来阻塞当前线程,直到响应到达(dispatch_group_wait)。如果您的twitter类试图在您发送limits消息的同一队列/线程上分派任何工作,这将导致死锁。
https://stackoverflow.com/questions/22118182
复制相似问题