2014-03-01 175 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類嘗試在發送消息的同一隊列/線程上分派任何工作,這將導致死鎖。