首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在惰性实例化中使用STTwitter

在惰性实例化中使用STTwitter
EN

Stack Overflow用户
提问于 2014-03-02 02:05:04
回答 1查看 163关注 0票数 0

我使用以下代码来设置一个属性,该属性在一个核心数据记录中保存有关twitter速率限制的信息:

代码语言:javascript
复制
- (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;
}

当它到达最后一行时,它不会反映新值,因为块还没有完成。我该怎么做才是最好的呢?

EN

回答 1

Stack Overflow用户

发布于 2014-03-02 19:28:18

像这样混合同步和异步代码是相当困难的。进行此操作的最佳方法是使您的limits方法异步,并让它接受一个完成块:

代码语言:javascript
复制
- (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消息的同一队列/线程上分派任何工作,这将导致死锁。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22118182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档