Асинхронные операции Twitter в NSOperationQueue

Чтобы загрузить кучу временных шкал 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 на 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 из запроса Twitter и загрузить его синхронно, используя sendSynchronousRequest:returningResponse:error:.

Вот мой вопрос(ы):

  • Есть ли смысл использовать NSOperationQueue для загрузки запросов Twitter, подобных этому?
  • Есть ли лучший метод для загрузки нескольких запросов Twitter?
  • Могу ли я улучшить способ использования очереди операций для этого?

person nevan king    schedule 14.05.2013    source источник
comment
Я думаю, вам следует полагаться на параллельную операцию, поскольку в непараллельных операциях, когда main завершается, операция удаляется из очереди. Если хотите, я могу попытаться дать вам несколько советов. Хорошего дня.   -  person Lorenzo B    schedule 15.05.2013


Ответы (1)


Просто используйте SLRequest и блоки. Чего вы хотите достичь?

См., например, https://github.com/ArchieGoodwin/NWTwitterHelper.

person nerowolfe    schedule 14.05.2013