如何同步获取 GCDWebServerBodyReaderCompletionBlock?

Posted

技术标签:

【中文标题】如何同步获取 GCDWebServerBodyReaderCompletionBlock?【英文标题】:How to get GCDWebServerBodyReaderCompletionBlock synchronously? 【发布时间】:2016-09-21 09:31:34 【问题描述】:

我正在做一个代理类的东西,它应该通过 NSURLSession 发出请求并逐步将其传输到 GCDWebServer 响应。

问题在于GCDWebServerStreamedResponse responseWithContentType:asyncStreamBlock——它需要一个内容类型,所以必须在我得到标题后调用。并且由于某种原因它会异步返回一个完成块,而可以更快地接收数据。

我的意思是,现在它是这样工作的:

    API 调用 GCDWebServer GCDWebServer 创建一个 NSURLSession 数据任务 数据任务接收头 创建 GCDWebServerStreamedResponse 接收数据块(我想将其推送到流式响应中) 从第 4 步得到完成块

如何在第 4 步之后立即获得完成块?

对不起,如果我错过了任何信息,只是我坚持下去,几乎可以肯定我做错了什么......

【问题讨论】:

【参考方案1】:

您可以使用NSMutableData 作为中间缓冲区:每当数据从NSURLSession 到达时,附加到它,每当调用GCDWebServerAsyncStreamBlock 时,返回该缓冲区并创建一个新的空缓冲区。

请务必使用NSLock 或 GCD 串行队列锁定对该缓冲区的访问。

【讨论】:

在没有内容类型的情况下如何做到这一点? 是的,但它看起来像一个肮脏的黑客,至少我在这里要求完全避免这种方式...... 这根本不是 hack:你试图让 2 个异步系统一起工作,所以你需要一个共享的“状态”,这里是一个 NSMutableData 对象。 我看不出为什么创建异步响应应该是异步的,以及为什么它必须在创建时立即具有内容类型。为什么不能创建响应然后再发送标头等等? GCDWebServerAsyncStreamBlock 只是一个做出一些假设的实用程序类。如果您想要更多控制权,请直接访问GCDWebServerResponse<GCDWebServerBodyReader>。您可以在 README 中阅读有关 GCDWebServer 架构的更多信息。

以上是关于如何同步获取 GCDWebServerBodyReaderCompletionBlock?的主要内容,如果未能解决你的问题,请参考以下文章

如何在非阻塞线程中同步获取单声道对象?

如何从base64图像数据字符串中同步获取宽度和高度?

如何刷新基于_id(非瞬态)的关系与获取不同步的对象

如何在 iOS 应用上同步 UITableView 滚动和 CoraData 获取?

如何使用 Xamarin 在 Android 中同步获取 GPS 位置更新?

node.js -- 同步执行命令并获取结果