Чтобы скачать кучу Twitter шкал я создал TWRequest
объектов в цикле и поместить их в единой NSOperationQueue
:операции Асинхронного Twitter в качестве 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
. Я также попробовал adding a dependant operation to the queue после всех запросов 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' завершаясь, оп удаляется из очереди. Если хотите, я мог бы попытаться дать вам некоторые подсказки. Хорошего дня. –