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

Posted

技术标签:

【中文标题】GCD dispatch_async 内部的 NativeX fetchAd 调用。 Phonegap 插件开发【英文标题】:NativeX fetchAd call inside of GCD dispatch_async. Phonegap plugin dev 【发布时间】:2015-08-12 04:23:24 【问题描述】:

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

感谢任何帮助!

【问题讨论】:

【参考方案1】:

出于几个原因,NativeX ios SDK 应该在主 UI 线程上运行。

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

NSURLConnection and grand central dispatch

GCD and async NSURLConnection

使用已创建的 GCD 线程,该线程将没有足够长的 runloop 以供 SDK 在完成时接收 NSURLConnection 委托调用。

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

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

【讨论】:

以上是关于GCD dispatch_async 内部的 NativeX fetchAd 调用。 Phonegap 插件开发的主要内容,如果未能解决你的问题,请参考以下文章

如何在目标 c 中使用 GCD dispatch_async 调用/编写以下方法

GCD

Grand Central Dispatch(GCD)

ios多线程 -- GCD 常见用法

iOS GCD学习笔记

GCD 全局并发队列并不总是并发(iOS 设备)?