我想要返回一个函数,该函数将依次回调自身。 是否可以通过返回一个自我调用闭包来完成?
我的问题是,我不确定这里使用的语法是否正确,以及我不确定它是否可能由于对自身的循环引用(并且很快就会很重)编译器类型检查)
我正在调整我的功能,以便模型和演示者不需要知道dataGateway进一步解耦我的代码
有关该问题的一些背景信息,API期望将页码传递给自己,我不想存储此状态。我希望函数能够传回一些东西,以便模型可以在需要时调用下一个函数。
我知道curried函数定义如下所示:
function (completion: ([Example.Product], UInt) -> Void) -> Example.Task?
在我的代码示例中查找__function_defined_here__
func fetch(dataGateway: DataGateway, category: String)(page: UInt)(completion: [Product] -> Void) -> Task? {
return dataGateway.productMap(category, page: page) { products in
completion(products.map { $0.build })
}
}
func fetch(dataGateway: DataGateway, category: String)(page: UInt)(completion: [Product] -> Void) -> (Task?, __function_defined_here__) {
return (dataGateway.productMap(category, page: page) { products in
completion(products.map { $0.build })
}, fetch(dataGateway, category: category)(page: page + 1))
}
func fetch(dataGateway: DataGateway, category: String)(page: UInt)(completion: ([Product], __function_defined_here__) -> Void) -> Task? {
return dataGateway.productMap(category, page: page) { products in
completion(products.map { $0.build }, fetch(dataGateway, category: category)(page: page + 1))
}
}
答案 0 :(得分:1)
我最终用类似下面的东西解决它,它的作用是创建一个类引用来存储下一个函数。我在完成异步操作时传递对该对象的引用。
extension Product {
class Next {
typealias FunctionType = (([Product], Next) -> Void) -> Task?
let fetch: FunctionType
init(_ fetch: FunctionType) {
self.fetch = fetch
}
}
func fetch(dataGateway: DataGateway, inCategory category: String)(page: UInt)(completion: ([Product], Next) -> Void) -> Task? {
return dataGateway.products(inCategory: category, page: page)() { products in
completion(products.map { $0.build }, Next(fetch(dataGateway, inCategory: category)(page: page + 1)))
}
}
}
let initial = Product.fetch(dataGateway, inCategory: "1")(page: 0)
将函数传递给数据模型
data() { [weak self] products, next in
self?.data = products
self?.setNeedsUpdate()
self?.next = next
}
向下滚动到表格视图的底部再次使用next
函数而不是data
触发上述内容