TwitterRequest Блок Синхронизации IOS5 - PullRequest
2 голосов
/ 01 января 2012

Я пытался работать на xcode и ios5, и у меня есть TWRequest для отмены твитов с помощью Twitter Api. Однако я не совсем понимаю, как работают блоки в iOS5. Например, в этом коде

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

    NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];
    NSArray* firstParse = [dictionary objectForKey:@"results"];

    for (NSDictionary *post in firstParse) {               
        Tweet *tweetMessage = [[Tweet alloc] init];
        tweetMessage.message =  [post objectForKey:@"text"];
        tweetMessage.user =  [post objectForKey:@"from_user"];

        [tweets addObject:tweetMessage];
    }
}];
NSLog(@"%@",[tweets count]);

Предполагая, что у меня есть твиты = [NSMutableArray arrayWithCapacity: 25]; позвоните куда-нибудь наверх.

Однако, каждый раз, когда я делаю это, счет всегда равен нулю. Проведя некоторое тестирование, я понял, что после запуска NSLog код блока запускался, показывая, что код не запускался сверху вниз, как я использовал.

Кто-нибудь знает, как исправить такую ​​проблему?

Я также попробовал этот более поздний пример, потому что я пытался переместить твиты в viewController, который имеет объект массива

tweetViewController.tweets = [NSMutableArray arrayWithCapacity:25];
[request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {

    NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];
    NSArray* firstParse = [dictionary objectForKey:@"results"];

    for (NSDictionary *post in firstParse)
    {               
        Tweet *tweetMessage = [[Tweet alloc] init];
        tweetMessage.message =  [post objectForKey:@"text"];
        tweetMessage.user =  [post objectForKey:@"from_user"];

        [tweetViewController.tweets addObject:tweetMessage];

        NSLog(@"%d",[tweets count]);
        //NSLog(@"%@: %@", [post objectForKey:@"from_user"], [post objectForKey:@"text"]);            
    }
}];

Tweet *tweetMessage = [[Tweet alloc] init];
tweetMessage.message =  @"HELLO";
tweetMessage.user =  @"HELLO";
[tweetViewController.tweets addObject:tweetMessage];
return YES;

Сообщения Hello отображаются правильно, а сообщения в блоке - нет.

1 Ответ

0 голосов
/ 01 января 2012

Не.В основном, сосредоточьтесь на том, чтобы сделать ваш код асинхронным.Это будет лучше для пользователя (пользовательский интерфейс будет более плавным) и проще для разработчика (да, действительно!)

Делайте все, что связано с загрузкой твитов в блок, а не после него.Поместите ваш NSLog в блок, а не снаружи.Как только вы закончите загрузку всех твитов, просто позвоните [tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; или что-то еще, чтобы обновить пользовательский интерфейс.

Не используйте флаг nonatomic в свойстве, в котором хранится tweets.Вы хотите избежать недопустимого межпоточного доступа.

...