我写了一个NativeX Phonegap/ Cordova 插件。现在我试图将 fetchAdWithCustomPlacement
调用推送到后台线程以避免阻塞主线程。
NSString* adName = [command.arguments objectAtIndex:0];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[[NativeXSDK sharedInstance] fetchAdWithCustomPlacement:adName delegate:self];
});
没有错误,并且 dispatch_async
block 确实运行了,但是相应的 NativeX 回调永远不会触发,就像我在主线程中获取广告一样。回调:
- (void)nativeXAdView:(NativeXAdView *)adView didLoadWithPlacement:(NSString *)placement
第一次使用 GCD。不知道是我做错了什么还是 NativeX 库。他们分发的是一个静态库,所以我没有阅读源代码。
感谢任何帮助!
最佳答案
出于几个原因,NativeX iOS SDK 应该在主 UI 线程上运行。
首先,SDK 使用 NSURLConnection 从服务器发出广告请求;这已经是一个异步操作,不需要从后台线程完成。根据 Apple 的建议,NSURLConnection 不应在后台线程中完成:
NSURLConnection and grand central dispatch
对于创建的 GCD 线程,线程不会有足够长的运行循环,SDK 无法在完成时接收 NSURLConnection 委托(delegate)调用。
您可以扩展 GCD 线程运行循环以运行到遥远的 future ,但这会导致 NativeX SDK 出现另一个问题;当连接完成时,SDK 通过创建 UIWebView 预加载广告。那个UIWebView只能在主线程上创建;在后台线程上创建它会导致 UIKit 崩溃。
简而言之;您应该仅从主线程调用 NativeX SDK。
关于ios - GCD dispatch_async 内部的 NativeX fetchAd 调用。 Phonegap插件开发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31955989/