我写了一个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。