在方法的最后一行之前先执行块

时间:2014-05-12 09:37:20

标签: objective-c block

目标c中块内的代码行在稍后以相同方法执行其他代码行之后执行。 我的疑问是:

有一个名为的方法:

-(NSDictionary*)callingWeatherService{
        NSString *urlString =  @"http://api.openweathermap.org/data/2.5/weather?q=London,uk";
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];

        AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
        operation.responseSerializer = [AFJSONResponseSerializer serializer];

        [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

            // 3
            self.dictionary = (NSDictionary *)responseObject;


        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

            // 4
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error Retrieving Weather"
                                                                message:[error localizedDescription]
                                                               delegate:nil
                                                      cancelButtonTitle:@"Ok"
                                                      otherButtonTitles:nil];
            [alertView show];
        }];


        // 5
        [operation start];
        return self.dictionary;
}

但是语句return self.dictionary;在块执行之前首先执行,因此字典返回为nil; 是否有任何解决方案只在块执行后执行语句return self.dictionary;。我需要这种方法用于特定目的。 不想使用委托,我已经在afnetworking块中使用委托来获取字典数据。

1 个答案:

答案 0 :(得分:0)

简短的回答是没有 - 块被设计为执行asynchronously,这意味着你永远不知道它们何时完成。改变这种行为真的很蠢。

使用代理,或使用分配给字典变量的KVONSNotifications。如果我是你,我肯定会使用delegates