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