目标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块中使用委托来获取字典数据。
答案 0 :(得分:0)
简短的回答是没有 - 块被设计为执行asynchronously
,这意味着你永远不知道它们何时完成。改变这种行为真的很蠢。
使用代理,或使用分配给字典变量的KVO
或NSNotifications
。如果我是你,我肯定会使用delegates
。