0

一連の 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 を使用してtwitterRequestQueueoperationCountました。また、すべての 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 リクエストをダウンロードするためのより良い手法はありますか?
  • このために操作キューを使用する方法を改善できますか?
4

1 に答える 1