一致地调用方法dataTaskWithRequest的块体

时间:2017-05-03 16:42:03

标签: objective-c json nsurlsession

例如: 我有一个功能

-(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]; 
}

在这种情况下,我意识到块的主体是在一个单独的线程中执行的,这会导致数据丢失。 我希望所有操作都按顺序执行。怎么做?

1 个答案:

答案 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];
}