Objective c 一致地调用dataTaskWithRequest方法的块体
例如: 我有一个函数Objective c 一致地调用dataTaskWithRequest方法的块体,objective-c,json,nsurlsession,Objective C,Json,Nsurlsession,例如: 我有一个函数 -(void) someFunc:(NSString *) searchRequest { NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; [[session dataTaskWithRequest:request completionHandle
-(void) someFunc:(NSString *) searchRequest {
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
[[session dataTaskWithRequest:request
completionHandler:^(NSData *data,NSURLResponse *response, NSError *error)
{
// body block
}
]
resume];
}
然后我调用someFunc:
- (IBAction)searchButtonPressed:(id)sender {
NSString * searchRequest = @"blablabla";
[self someFunc:searchRequest];
}
在本例中,我意识到块体是在单独的线程中执行的,这会导致数据丢失。
我希望所有操作都按顺序执行。如何执行?如果希望
someFunc:
返回值,请研究使用dispatch\u信号量\u t
阻止调用线程,直到请求完成,并将返回值分配给\u block
限定变量
您还可以修改someFunc:
,将块作为请求完成时将调用的附加参数
- (void)someFunc:(NSString *)searchRequest completion:(void(^)(id result))completion {
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
[[session dataTaskWithRequest:request
completionHandler:^(NSData *data,NSURLResponse *response, NSError *error)
{
completion(data);
}]
resume];
}
someFunc:
不应在completionHandler:^(NSData*data,nsurresponse*response,NSError*error){}内返回值。
我从url解析json文件,并将值存储在类属性中。然后在tableview中显示。现在证明json文件中的信息不会加载,因为解析是在一个单独的线程中延迟执行的,块被推到堆栈上等待。处理完成块内的数据,然后使用表视图所需的模型对象在主线程上调用提供的完成。