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

NativeX fetchAd call inside of GCD dispatch_async. Phonegap plugin dev

我写了一个 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 块肯定是 运行,但是相应的 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 委托调用。

您可以将 GCD 线程 运行 循环扩展到 运行 到遥远的未来,但这会导致 NativeX SDK 出现另一个问题;连接完成后,SDK 会通过创建 UIWebView 来预加载广告。即UIWebView只能在主线程上创建;在后台线程上创建它会导致 UIKit 崩溃。

简而言之;您应该只从主线程调用 NativeX SDK。