2013-05-14 1 views
0

Чтобы скачать кучу 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?
  • Могу ли я улучшить способ использования очереди операций для этого?
+0

Я думаю, вы должны полагаться на параллельной работы, так как в неконкурирующих операций, когда 'main' завершаясь, оп удаляется из очереди. Если хотите, я мог бы попытаться дать вам некоторые подсказки. Хорошего дня. –

ответ

 Смежные вопросы

  • Нет связанных вопросов^_^