在Swift中为URLSession定义完成处理程序的最佳方法

时间:2017-08-01 02:49:50

标签: swift closures urlsession

我调用了一个URLSession:

var someVar = "Are you in my scope?"
let task = session.dataTask(with: url, completionHandler: updatePlaces)

其中updatePlaces是一个定义为:

的函数
 private func updatePlaces(data: Data?, response: URLResponse?, error: Error?) -> Void

我把它拆分成另一个函数,因为我真的不喜欢把它作为一个大块的代码,我的“updatePlaces”函数作为我原来的session.dataTask中的一个闭包。它似乎在一个功能中做得太多了。我想分开它。

我也可以使用下面的语法创建一个闭包,但我发现这和函数之间没有区别(我理解一个函数是一种特殊类型的闭包,我认为没有区别):

lazy var updatePlaces: (Data?, URLResponse?, Error?) -> Void = {(data, response, error) in

但是,之前您看到我向范围添加了someVar。使用函数和lazy var,我无权访问someVar。但是,如果我在session.dataTask中创建了闭包,则会捕获someVar并且我可以根据文档引用它:

  

闭包可以捕获和存储对任何常量的引用   来自定义它们的上下文中的变量。这被称为   关闭那些常量和变量。 Swift处理所有的   记忆管理为你捕捉。

所以......我有两个具体的问题。

我的函数声明和闭包声明之间是否存在任何差异,只是将它传递给完成处理程序。

如果我没有在其中定义闭包,有没有办法捕获原始函数中的引用?我猜不是。

还有一个更通用的问题:处理这个问题的首选方法是什么?

0 个答案:

没有答案
相关问题