2014-03-01 79 views
0

使用STTwitter我用下面的代码来设置保存有关的核心数据记录的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; 
} 

当它到达的最后一行,这不是”由于该块尚未完成,因此不能反映新值。我怎么能最好的去做这件事?

回答

0

像这样混合同步和异步代码非常困难。与此先走,最好的办法是让你的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); 
     }]; 
     } 
} 

。阻止网络访问的主线程不会带来良好的用户体验,并且如果请求时间过长,可能会导致看门狗杀死您的应用。

如果这不是一个选项,你基本上必须等待请求完成。如果你的TwitterManager支持,最简单的方法是使用同步方法。如果没有,有不同的方法来处理这个问题,这取决于如何实现TwitterManager类。

如果一切运行在不同的线程上,您可以使用一个调度组来阻止当前的线程,直到响应到达(dispatch_group_wait)。如果您的Twitter类尝试在发送消息的同一队列/线程上分派任何工作,这将导致死锁。