例如: 我有一个功能
-(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];
}
在这种情况下,我意识到块的主体是在一个单独的线程中执行的,这会导致数据丢失。 我希望所有操作都按顺序执行。怎么做?
答案 0 :(得分:1)
如果希望someFunc:
返回值,请使用dispatch_semaphore_t
来阻止调用线程,直到请求完成,并将返回值赋给__block
限定变量。< / p>
您还可以修改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];
}