Чтобы загрузить кучу временных шкал 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?
- Могу ли я улучшить способ использования очереди операций для этого?
main
завершается, операция удаляется из очереди. Если хотите, я могу попытаться дать вам несколько советов. Хорошего дня. - person Lorenzo B   schedule 15.05.2013