一連の Twitter タイムラインをダウンロードするためTWRequest
に、ループ内にオブジェクトを作成し、次のように配置しました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];
}
すべてのタイムラインがいつダウンロードされたかを判断するために、最初にKVO on を使用してtwitterRequestQueue
みoperationCount
ました。また、すべての Twitter リクエストの後に、依存操作をキューに追加しようとしました。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");
}
}
signedURLRequest
これを機能させるもう 1 つの方法は、Twitter リクエストからを取得し、を使用して同期的にダウンロードすることsendSynchronousRequest:returningResponse:error:
でした。
ここに私の質問があります:
NSOperationQueue
このような Twitter リクエストをダウンロードするために を使用する意味はありますか?- 複数の Twitter リクエストをダウンロードするためのより良い手法はありますか?
- このために操作キューを使用する方法を改善できますか?