Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 一致地调用dataTaskWithRequest方法的块体_Objective C_Json_Nsurlsession - Fatal编程技术网

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文件中的信息不会加载,因为解析是在一个单独的线程中延迟执行的,块被推到堆栈上等待。处理完成块内的数据,然后使用表视图所需的模型对象在主线程上调用提供的完成。