我想我可能在这里遇到了一个异步问题,这让我觉得我已经解决了它。不管怎样,我正在进行一堆网络服务调用,如下所示:
//get the client data
__block NSArray* arrClientPAs;
[dataManager getJSONData:strWebService withBlock:^(id results, NSError* error) {
if (error) {
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Getting Client Data Error!" message:error.description delegate:nil cancelButtonTitle:NSLocalizedString(@"Okay", nil) otherButtonTitles:nil, nil];
[alert show];
} else {
arrClientPAs = results;
}
}];
getJSONData 就像这样:
- (void) getJSONData : (NSString*) strQuery withBlock:(void (^)(id, NSError *))completion {
NSDictionary* dictNetworkStatus = [networkManager checkNetworkConnectivity];
NetworkStatus networkStatus = [[dictNetworkStatus objectForKey:@"Status"] intValue];
if (networkStatus != NotReachable) {
//set up the url for webservice
NSURL* url = [NSURL URLWithString:strQuery];
NSMutableURLRequest* urlRequest = [NSMutableURLRequest requestWithURL:url];
//set up the url connection
__block id results;
[NSURLConnection sendAsynchronousRequest:urlRequest queue:[NSOperationQueue mainQueue] completionHandler:
^(NSURLResponse* response, NSData* jsonData, NSError* error) {
if (error) {
completion(nil, error);
return;
}
results = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves | NSJSONReadingAllowFragments error:&error];
completion(results, nil);
}];
} else {
//not connected to a network - data is going to have to come from coredata
}
}
在第一个块中,如果我记录 arr 客户端数据,我可以看到我期望的数据,但是当我记录 arr 客户端数据后,它为零。我正在关注这个SO线程-如何在方法中使用异步请求返回 BOOL? (目标-C) https://stackoverflow.com/questions/14161257/how-to-return-a-bool-with-asynchronous-request-in-a-method-objective-c和其他几个。
显然我正在尝试在异步调用后获取数据。任何帮助,将不胜感激。
我认为问题在于“异步”的含义。这是一个图表:
Step One
__block result;
Step Two - do something asynchonous, including e.g. setting result
Step Three
这里的事情发生的顺序是什么?第三步发生before第二步就完成了。That这就是异步的意思:它的意思是,“继续this代码,不要等待异步内容完成。”因此,在第三步发生时,result
变量尚未设置为任何内容。
所以,你只是在误导自己__block result
. __block
or no __block
,你不可能知道什么result
is 然后,因为没有“之后”。您的代码已在您之前完成__block result
甚至已设置。这就是异步代码使用回调的原因(例如,您的completion
块)哪个does之后运行,因为它是异步代码的连续部分(附加到)。你可以交出你的结果向下通过回调,但你不能有效地设置它upwards从块内并期望稍后检索它。
所以,你的整体结构是这样的:
__block NSArray* arrClientPAs; // it's nil
[call getJSONdata] = step one
[call sendAsynchronousRequest]
do the block _asynchronously_ = step two, tries to set arrClientPAs somehow
step three! This happens _before_ step two, ...
... and this entire method ends and is torn down ...
... and arrClientPAs is still nil! ????
我重复一遍:您无法从异步块中传递任何信息。你只能往下走。您需要异步块来调用某些方法独立持久对象交给它你的结果并告诉它使用该结果(并在主线程上小心地执行,否则你会造成严重破坏)。你不能使用any用于此目的的自动变量,例如您声明的 NSArray 变量arrClientPAs
;不再有自动作用域,方法结束,自动变量消失,没有更多的代码可以运行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)