2013-05-14 38 views
0

異步Twitter的操作要下載一堆Twitter的時間表,我在一個循環中創建TWRequest對象,並把它們放到一個NSOperationQueue在NSOperationQueue

twitterRequestQueue = [[NSOperationQueue alloc] init]; 

// Get a reference to a Twitter account 

NSArray *screenNames = @[@"gruber", @"kottke", @"ev", @"brad", @"borkware", @"jack", @"greatdismal", @"wilshipley"]; 
NSURL *url = [NSURL URLWithString:@"https://api.twitter.com/1.1/statuses/user_timeline.json"]; 

for (NSString *screenName in screenNames) { 
    NSDictionary *parameters = @{@"screen_name" : screenName, @"count" : @"200" }; 
    TWRequest *request = [[TWRequest alloc] initWithURL:url parameters:parameters requestMethod:TWRequestMethodGET]; 
    [request setAccount:account]; 

    // Make an operation using the Twitter request 
    NSBlockOperation *twitterOperation = [NSBlockOperation blockOperationWithBlock:^{ 
     [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { 
      // Do stuff with the responseData 
     }]; 
    }]; 

    // Put the requests into an operation queue 
    [twitterRequestQueue addOperation:twitterOperation]; 
} 

要確定當所有的時間表已經被下載了,我第一次嘗試using KVO on twitterRequestQueue's operationCount。在所有Twitter請求之後,我也嘗試了adding a dependant operation to the queue。這兩個都失敗了,因爲Twitter請求幾乎立即返回並在調用完成塊之前從操作隊列中移除。

相反,我手動存儲在我的請求在一個可變的陣列,調用一個自定義的方法[self requestCompleted:request];在Twitter的完成塊的末端,並手動從我的可變數組移除所述請求作爲每完成:

- (void)requestCompleted:(TWRequest *)request 
{ 
    NSDictionary *parameters = [request parameters]; 
    NSString *screenName = [parameters valueForKey:@"screen_name"]; 
    NSLog(@"Request completed: %@", screenName); 

    [requestsInProgress removeObject:request]; 
    if ([requestsInProgress count] == 0) { 
     NSLog(@"All requests finished"); 
    } 
} 

另一種方式我可以使它工作是從Twitter請求獲得signedURLRequest並使用sendSynchronousRequest:returningResponse:error:同步下載它。

這是我的問題(S):

  • 是否有使用NSOperationQueue下載Twitter的請求,任何這樣的地步?
  • 有更好的技術來下載多個Twitter請求嗎?
  • 我可以改進我爲此使用操作隊列的方式嗎?
+0

我認爲你應該在非併發操作依靠併發操作,因爲,當'main'終止,運算從隊列中刪除。如果你願意,我可以嘗試向你提供一些提示。祝你今天愉快。 – 2013-05-15 07:55:11

回答