如何同步获取 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 应用上同步 UITableView 滚动和 CoraData 获取?