iOS中多网络请求的线程安全详解

2020-01-21 01:44:55丽君


var results: (left: URLResult?, right: URLResult?) = (nil, nil)

func continuation() {
 guard case let (left?, right?) = results else { return }
 completionHandler(left, right)
}

将这段代码继续添加到实现中,其中定义了一个表示返回结果的元组变量 results 。另外,我们还在函数内部定义了另一个工具函数用于检查是否两个请求都已经完成结果处理。


let left = get(left) { result in
 results.left = result
 continuation()
}

let right = get(right) { result in
 results.right = result
 continuation()
}

return (left, right)

最后将这段代码追加到实现中,其中我们分别对两个 URL 进行了请求并在请求都完成后一次返回了结果。值得注意的是这里我们通过两次执行 continuation() 来判断请求是否全部完成:

第一次执行 continuation() 时因为其中一个请求并未完成结果为 nil 所以回调函数并不会执行。 第二次执行的时候两个请求全部完成,执行回调处理。

接下来我们可以通过简单的请求来测试下这段代码:


extension URLResult {
 var string: String? {
  guard case let .response(data, _) = self,
  let string = String(data: data, encoding: .utf8)
  else { return nil }
  return string
 }
}

URLSession.shared.get(zen, zen) { left, right in
 guard case let (quote1?, quote2?) = (left.string, right.string)
 else { return }

 print(quote1, quote2, separator: "n")
 // Approachable is better than simple.
 // Practicality beats purity.
}

并行悖论

我发现解决并行问题最简单最优雅的方法就是尽可能的少使用并发编程,而且我们的处理器非常适合执行那些线性代码。但是如果将大的代码块或任务拆分为多个并行执行的小代码块和任务将会让代码变得更加易读和易维护。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对ASPKU的支持。

作者:Adam Sharp,时间:2017/9/21

翻译:BigNerdCoding, 如有错误欢迎指出。原文链接


注:相关教程知识阅读请移步到IOS开发频道。