GCD NSURLSession completionHandler 块 return 值 null
GCD NSURLSession completionHandler block return value null
我有一个带标签的视图
这些标签将在 viewdidload 时具有新值
在 viewdidload 中调用了 2 种方法。
第一个将从另一个 class 调用 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 中的另一个。
请帮忙
谢谢
你需要调整一下思路。您的结果可能无法在 viewDidLoad 中使用。相反,您启动 NSURLSessionDataTask,并在完成处理程序中获得所需的结果,根据需要格式化它们,然后在对 dispatch_async(dispatch_get_main_queue 的调用中进行 UI 更改()) 在完成块内。
完成块在后台线程上调用,进行准备工作,然后使用 dispatch_async 调用代码将新数据安装到主线程上的 UI。
我有一个带标签的视图
这些标签将在 viewdidload 时具有新值
在 viewdidload 中调用了 2 种方法。
第一个将从另一个 class 调用 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 中的另一个。
请帮忙
谢谢
你需要调整一下思路。您的结果可能无法在 viewDidLoad 中使用。相反,您启动 NSURLSessionDataTask,并在完成处理程序中获得所需的结果,根据需要格式化它们,然后在对 dispatch_async(dispatch_get_main_queue 的调用中进行 UI 更改()) 在完成块内。
完成块在后台线程上调用,进行准备工作,然后使用 dispatch_async 调用代码将新数据安装到主线程上的 UI。