我写了一个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库。他们分发的是一个静态库,因此我没有阅读源代码。

任何帮助表示赞赏!

最佳答案

出于以下几个原因,应在主UI线程上运行NativeX iOS SDK。

首先,SDK使用NSURLConnection从服务器发出广告请求;这已经是一个异步操作,不需要从后台线程完成。根据苹果公司的建议,NSURLConnection不应在后台线程中完成:

NSURLConnection and grand central dispatch

GCD and async NSURLConnection

使用创建的GCD线程,该线程将没有足够长的运行循环,以便SDK在完成时无法接收NSURLConnection委托调用。

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

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

10-08 03:46