猿问

带有NSBlockOperation和队列的NSURLSession

我有一个目前NSURLConnection用于绝大多数网络的应用程序。我想转到这里,NSURLSession因为Apple告诉我这是要走的路。

我的应用程序仅NSURLConnection通过+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)errorclass方法使用的同步版本。我这样做NSBlockOperationNSOperationQueue为了避免不必要地阻塞主队列。用这种方式做事的最大好处是,我可以使操作相互依赖。例如,我可以让请求数据的任务取决于登录任务的完成。

我尚未在中看到任何对同步操作的支持NSURLSession。我所能找到的只是文章,甚至欺骗了我,甚至考虑同步使用它,而且我是阻塞线程的可怕人。精细。但是我看不到任何使NSURLSessionTask彼此依赖的方法。有没有办法做到这一点?

还是有关于我将如何以其他方式做这样的事情的描述?


烙印99
浏览 559回答 3
3回答

米琪卡哇伊

如果基于信号量的方法不起作用,请尝试基于轮询的方法。var reply = Data()/// We need to make a session object./// This is key to make this work. This won't work with shared session.let conf = URLSessionConfiguration.ephemerallet sess = URLSession(configuration: conf)let task = sess.dataTask(with: u) { data, _, _ in    reply = data ?? Data()}task.resume()while task.state != .completed {    Thread.sleep(forTimeInterval: 0.1)}FileHandle.standardOutput.write(reply)基于轮询的方法非常可靠地工作,但是有效地将最大吞吐量限制为轮询间隔。在此示例中,它被限制为10次/秒。我为此做了一个Swift包。到目前为止,基于信号量的方法已经很好地工作了,但是自Xcode 11时代以来,它就被打破了。(也许只适合我吗?)如果我等待信号量,数据任务不会完成。如果我在其他线程上等待信号量,则该任务将失败并显示错误。nw_connection_copy_protocol_metadata [C2] Client called nw_connection_copy_protocol_metadata on unconnected nw_connection error.随着苹果公司的发展,实施似乎有所改变Network.framework。

跃然一笑

我鼓励您发布答复作为解决方案NSURLSession.dataTaskWithURL(_:completionHandler:):此方法旨在替代NSURLConnection的sendAsynchronousRequest:queue:completionHandler:方法,并具有支持自定义身份验证和取消的附加功能。
随时随地看视频慕课网APP

相关分类

iOS
我要回答