Возвращение NSDictionary из блока асинхронного кода? [Дубликат]

Possible Duplicate:
returning UIImage from block

Здравствуйте, я пытаюсь вернуть словарь данных JSON Twitter, чтобы я мог использовать его в своем приложении. Как бы то ни было, он вызывается из асинхронного блока. Я не могу сохранить его или вернуть какие-либо мысли?

  -(NSDictionary *)TweetFetcher
    {

    TWRequest *request = [[TWRequest alloc] initWithURL:
                          [NSURL URLWithString: @"http://search.twitter.com/search.json?
    q=iOS%205&rpp=5&with_twitter_user_id=true&result_type=recent"] parameters:nil 
    requestMethod:TWRequestMethodGET];


    [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse 
    *urlResponse, 
    NSError *error)
     {
         if ([urlResponse statusCode] == 200) 
         {
             NSError *error;        
             NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseData 
             options:0 error:&error];


             //resultsArray return an array [of dicitionaries<tweets>];
             NSArray* resultsArray = [dict objectForKey:@"results"]; 
             for (NSDictionary* internalDict in resultsArray)

                 NSLog([NSString stringWithFormat:@"%@", [internalDict 
             objectForKey:@"from_user_name"]]);
        ----> return dict; // i need this dictionary of json twitter data
         }
         else
             NSLog(@"Twitter error, HTTP response: %i", [urlResponse statusCode]);
         }];
      }

Спасибо заранее!

 David Yang Liu24 мая 2012 г., 21:10
@bbum привет, спасибо за быстрый ответ, ребята. Я знаю, что должен сделать это синхронно, но как? в классе twitter методы в .h ограничены, я думаю, что executeRequestWithHandler был одним из немногих, которые я видел!
 Josh Caswell24 мая 2012 г., 20:07
 paulmelnikow24 мая 2012 г., 20:04
Вы говорите, что он асинхронный & # x2013; не означает ли это, что ваш метод возвращается до завершения запроса? Если это правда, вы не можете вернуть его из этого метода.
 bbum24 мая 2012 г., 20:07
Что @noa сказал; вам нужно либо сделать вызов синхронно, либо передать словарь куда-нибудь полезный изнутри блока.

Ответы на вопрос(1)

Решение Вопроса

- (void)tweetFetcherWithCompletion:(void(^)(NSDictionary *dict, NSError *error))completion
{
    NSURL *URL = [NSURL URLWithString:@"http://search.twitter.com/search.json?q=iOS%205&rpp=5&with_twitter_user_id=true&result_type=recent"];
    TWRequest *request = [[TWRequest alloc] initWithURL:URL parameters:nil requestMethod:TWRequestMethodGET];

    [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
        if ([urlResponse statusCode] == 200) {
            NSError *error;
            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];

            if (error) {
                completion(nil, error);
                return;
            }

            //resultsArray return an array [of dicitionaries<tweets>];
            NSArray* resultsArray = [dict objectForKey:@"results"]; 
            for (NSDictionary* internalDict in resultsArray)
                NSLog(@"%@", [internalDict objectForKey:@"from_user_name"]);

            completion(dict, nil);
        }
        else {
            NSLog(@"Twitter error, HTTP response: %i", [urlResponse statusCode]);
            completion(nil, error);
        }
    }];
}

Так что вместо звонкаself.tweetDict = [self TweetFetcher];Вы бы назвали это так.

[self tweetFetcherWithCompletion:^(NSDictionary *dict, NSError *error) {
    if (error) {
        // Handle Error Somehow
    }

    self.tweetDict = dict;
    // Everything else you need to do with the dictionary.
}];
 24 мая 2012 г., 22:55
Извините, я не совсем знаю, что сказать. Я не знаю ни одного хорошего асинхронного руководства, я просто поднял его, сделав много ошибок и задав много вопросов. Я также не фанат документации Apple.
 24 мая 2012 г., 22:25
Я сделал ошибку в декларации. Печатая быстро, я думаю. Это должно было вызвать другую ошибку, но попробуйте новый код или просто измените ваш код.
 David Yang Liu25 мая 2012 г., 03:39
Ну, приятель, я думаю, что им просто придется больше с этим связываться. ура
 David Yang Liu24 мая 2012 г., 22:07
Привет, Джефф, спасибо за помощь, он дает мне ошибку компоновщика, я не связываю библиотеку или я должен импортировать класс? & quot; _completion & quot ;, на который ссылаются: ___ 59- [UsersWithBlogsViewControllerTweetFetcherWithCompletion:] _ block_invoke_0 в UsersWithBlogsViewController.o
 David Yang Liu24 мая 2012 г., 22:36
Джефф, да, я исправил декларацию и заставил ее работать! большое большое спасибо!!! чувак, я чувствую, что мне нужно больше обращать внимание на асинхронность и темы больше .. любой совет? Кажется, у меня проблемы с пониманием Apple Doc (действительно нужно это исправить). Кажется, что не вся информация находится в одном месте, и когда вы переходите от ссылки к ссылке ... это сбивает с толку

Ваш ответ на вопрос