为了账号安全,请及时绑定邮箱和手机立即绑定

带有NSBlockOperation和队列的NSURLSession

带有NSBlockOperation和队列的NSURLSession

iOS
烙印99 2019-11-11 13:19:54
我有一个目前NSURLConnection用于绝大多数网络的应用程序。我想转到这里,NSURLSession因为Apple告诉我这是要走的路。我的应用程序仅NSURLConnection通过+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)errorclass方法使用的同步版本。我这样做NSBlockOperation是NSOperationQueue为了避免不必要地阻塞主队列。用这种方式做事的最大好处是,我可以使操作相互依赖。例如,我可以让请求数据的任务取决于登录任务的完成。我尚未在中看到任何对同步操作的支持NSURLSession。我所能找到的只是文章,甚至欺骗了我,甚至考虑同步使用它,而且我是阻塞线程的可怕人。精细。但是我看不到任何使NSURLSessionTask彼此依赖的方法。有没有办法做到这一点?还是有关于我将如何以其他方式做这样的事情的描述?
查看完整描述

3 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

如果基于信号量的方法不起作用,请尝试基于轮询的方法。


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.ephemeral

let 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。


查看完整回答
反对 回复 2019-11-11
?
跃然一笑

TA贡献1826条经验 获得超6个赞

我鼓励您发布答复作为解决方案NSURLSession.dataTaskWithURL(_:completionHandler:):


此方法旨在替代NSURLConnection的sendAsynchronousRequest:queue:completionHandler:方法,并具有支持自定义身份验证和取消的附加功能。


查看完整回答
反对 回复 2019-11-11
  • 3 回答
  • 0 关注
  • 552 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信