Как синхронизировать переменные с TWRequest executeRequestWithHandler в iOS5?

Я действительно не мог понять, как бороться с iOS5 Twitter API TWRequest executeRequestWithHandler. Я объявил переменную экземпляра NSMutableArray *parsedTimeLine в моем файле.h и сигнатуру метода -(void) fetchWebData: (NSString *) screenName;

Реализация указанного метода здесь:

- (void) fetchWebData: (NSString *) screenName {

NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
[params setObject:screenName forKey:@"screen_name"];
[params setObject:@"f" forKey:@"include_entities"];
[params setObject:@"f" forKey:@"include_rts"];
[params setObject:@"10" forKey:@"count"];
[params setObject:@"t" forKey:@"trim_user"];
[params setObject:@"f" forKey:@"contributor_details"];
[params setObject:@"t" forKey:@"exclude_replies"];

NSURL *url = [NSURL URLWithString:@"http://api.twitter.com/1/statuses/user_timeline.json"];

TWRequest *request = [[TWRequest alloc] initWithURL:url
                                         parameters:params
                                      requestMethod:TWRequestMethodGET];
[request performRequestWithHandler:
 ^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {

     if (responseData) {
         NSError *jsonError;

         parsedUserTimeLine =[NSJSONSerialization JSONObjectWithData:responseData
                                                         options:NSJSONReadingMutableLeaves
                                                           error:&jsonError];

         NSLog(@"jsonArray result count inside request: %d",parsedUserTimeLine.count);
         NSLog(@"jsonArray values inside request: %@", parsedUserTimeLine);
     }
 }];   
NSLog(@"jsonArray result count outside request: %d",parsedUserTimeLine.count);
NSLog(@"jsonArray values outside request: %@", parsedUserTimeLine);    

}

Это работает хорошо, но есть странная вещь, которую я действительно не мог понять. Мои 2 NSLogs ВНУТРИ метода запроса показывают точное значение счетчика и содержимое массива parsedUSerTimeline. Но мои 2 NSLogs ВНЕ ЗАПРОСА показывают метод

-jsonArray счетчик результатов вне запроса: 0 -jsonArray значения вне запроса: (ноль)

Кроме того, я проверил значение parsedUserTimeLine в моем viewDidLoad после вызова метода fetchWebData, показывающего count = 0 и value = null.

Пожалуйста, помогите мне с этим, ребята. Мне нужно получить доступ к значению parsedUserTimeLine глобально. Заранее спасибо.

1 ответ

Решение

Я не знаю Twitter-Framework, но из кода, который вы разместили, я могу сказать, что он будет выполнять асинхронно. NSLogs оба действительны. Внутренние NSLogs вызываются, когда запрос завершен, внешние вызываются, даже если запрос не был запущен.

Просто вызовите метод, чтобы сообщить другим, если запрос был завершен.

[request performRequestWithHandler:
 ^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {

 if (responseData) {
     NSError *jsonError;

     NSDictionary *parsedUserTimeLine =[NSJSONSerialization JSONObjectWithData:responseData
                                                     options:NSJSONReadingMutableLeaves
                                                       error:&jsonError];

     NSLog(@"jsonArray result count inside request: %d",parsedUserTimeLine.count);
     NSLog(@"jsonArray values inside request: %@", parsedUserTimeLine);

     // The request will be perform on another thread, so call the method on the main
     // thread to avoid crossing operations
     [NSOperationQueue mainQueue] addOperationWithBlock:^{
         [self requestHasFinishedWithData:parsedUserTimeLine];
     }]

 }
}];
Другие вопросы по тегам