GCD NSURLSession completionHandler 块返回值 null

Posted

技术标签:

【中文标题】GCD NSURLSession completionHandler 块返回值 null【英文标题】:GCD NSURLSession completionHandler block return value null 【发布时间】:2016-02-21 02:29:35 【问题描述】:

我有一个带有标签的视图 当 viewdidload 时,这些标签将有一个新值 在 viewdidload 中有对 2 种方法的调用。 第一个将从另一个类调用 a 方法,该方法将有一个 NSURLSessionDataTask 将有 completionHandler 块。 我想将会话NSHTTPURLResponse 中的这些标签的新值设置为字典对象。 问题是,当视图确实加载标签的值为空时。 我知道这是因为视图在第一个完成之前调用了一个方法,这就是块!

我不知道如何让第一个方法完成然后调用第二个。

我试过这样做

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ // 1
[AnotherClass method:argu anotherArgu:argue2]; // calling the method from the otherclass, this method have completionHandler block
_curentObj = [AnotherClass currentObje]; 
dispatch_async(dispatch_get_main_queue(), ^ // 2
[self setupUserLabel]; // 3 this method will set the new value for the label from _currentObj but it's null
);
);

我不知道如何让它完成第一个调用[AnotherClass method:argu anotherArgu:argue2];,然后在完成并完成后调用 viewdidload 中的另一个。 请帮忙 谢谢

【问题讨论】:

【参考方案1】:

你需要调整你的想法。您的结果可能在 viewDidLoad 中不可用。相反,您启动 NSURLSessionDataTask,并在完成处理程序中,获得所需的结果,根据需要对其进行格式化,然后在调用 dispatch_async(dispatch_get_main_queue()) 在完成块内进行 UI 更改强>。

在后台线程上调用完成块,完成准备工作,然后使用 dispatch_async 调用代码以将新数据安装到主线程上的 UI 中。

【讨论】:

但 NSURLSessionDataTask 在另一个类中,我为所有 HTTPRequests 设置了一个单独的类。我不知道如何从 otherclass 更新视图,我知道我可以在完成块内调用 dispatch_async(dispatch_get_main_queue()) 但是如果视图类中的这个方法不是;/跨度> 所以创建一个带有完成块的下载方法,并在 URL 任务的完成块中调用完成块。然后调用下载方法并传入一个更新标签的完成块。 谢谢您的帮助! 我完全按照你说的做了,我在 *** ***.com/a/31178931/1322263 中找到了这个答案我选择了第二个选项,在块内我调用了更新 UI 元素的方法,但我必须 dispatch_async(dispatch_get_main_queue () 调用更新 UI 元素的方法,如果我没有调用主队列,则视图将永远不会用新数据更新。 正确。您必须始终在主线程上进行 UI 更改(以及几乎所有 UIKit 调用),否则会发生意外和/或坏事。

以上是关于GCD NSURLSession completionHandler 块返回值 null的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSession 委托跨类拆分 - NSURLSession、NSURLUploadTask、NSURLDownloadTask

iOS开发系列-NSURLSession

学习NSURLSession

NSURLSession各文件关系

iOS开发-NSURLSession

NSURLSession学习