ios - GCD dispatch_async 内部的 NativeX fetchAd 调用。 Phonegap插件开发

标签 ios cordova sdk phonegap-plugins grand-central-dispatch

我写了一个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 and async NSURLConnection

对于创建的 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/

相关文章:

ios - 状态为 :0 for URL:null when i am making a rest from ios ionic app 的响应

ios - 评估项目是否已在数组中

android - PhoneGap Geolocation 在特殊设备上总是超时

java - Android开发的最低硬件要求?

ios - Firebase 运行时崩溃 - FIRInstanceIDConfig

ios - 限制动态 UIScrollView 的约束范围

xcode - Xcode、IntelliJ Idea 和 Phonegap(又名 Cordova)的 gitignore 模板

cordova - 检测 Meteor Cordova 应用程序何时进入后台

android - 是否可以从 linux 层上运行的任何脚本/程序访问 Android API?

ios - 如何在iPhone中的UIScrollView中动态添加图像