異步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請求嗎?
- 我可以改進我爲此使用操作隊列的方式嗎?
我認爲你應該在非併發操作依靠併發操作,因爲,當'main'終止,運算從隊列中刪除。如果你願意,我可以嘗試向你提供一些提示。祝你今天愉快。 – 2013-05-15 07:55:11