gpt4 book ai didi

swift - FRP 星际、转换、链接信号

转载 作者:行者123 更新时间:2023-11-28 06:55:12 25 4
gpt4 key购买 nike

假设有两个需要按顺序执行的 API 异步请求。第一个请求的结果是字典,第二个请求使用它来获得最终字典。Interstellar ( https://github.com/JensRavens/Interstellar ) 支持以一种方式链接异步请求,以按顺序一个接一个地执行它们:例如:

typealias JSONDictionary = [String: AnyObject]

func create(parameters: JSONDictionary, completion: Result<JSONDictionary> -> Void) {
Request.POST("objects", parameters: parameters, completion: completion)
}

func verify(parameters: JSONDictionary, completion: Result<JSONDictionary> -> Void) {
guard let id = parameters["id"] as? String else {
let error = NSError(domain: "", code: 401, userInfo: nil)
completion(.Error(error))
return
}
Request.POST(String(format: "objects/%@/verify", id), parameters: nil, completion: completion)
}

需要先执行“create”,然后使用结果字典执行“verify”:这很好用:

address.flatMap(Address.create).flatMap(Address.verify)
.next { dictionary in
expectation.fulfill()
}
.error { error in
print("There was a an error: \(message)")
}
address.update(self.parameters)

下面的代码(来自 Interstellar 幻灯片):

infix operator >>> { associativity left precedence 160 }
func >>> <A, B> (left: Signal<A>, right: A->Result<B>) -> Signal<B> {
return left.flatMap(right)
}
func >>> <A, B> (left: Signal<A>, right: (A, (Result<B> -> Void)) -> Void) -> Signal<B> {
return left.flatMap(right)
}
func >>> <A, B> (left: Signal<A>, right: A -> B) -> Signal<B> {
return left.flatMap(right)
}

可以使用:

address >>> Address.create >>> Address.verify

这就更清楚了。但是,如果验证被定义为(接受 id 而不是字典):

func verify2(id: String, completion: Result<[String: String]> -> Void) { ... }

为了链接它,我定义了另一个函数:

static func idValue(dictionary: JSONDictionary, completion: Result<String> -> Void) { ... )

这基本上是从字典中解压 id 键的值(将字典转换为字符串),我可以使用:

address >>> Address.create >>> Address.idValue >>> Address.verify2

这在 FRP 中是常见的做法吗?我可以避免中间的步骤吗?

最佳答案

很高兴听到您正在使用这个库。是的 - 这就是它应该工作的方式。以下是一些如何使其更易于阅读的小想法:

  • 在发布 lib 之前删除了自定义运算符,主要是因为开发人员不喜欢它(他们也改变了我的想法。flatMap 在复杂情况下更具可读性)
  • 函数式编程的主要思想之一是让类型系统为您工作。如果 Address.create 返回一个 Address 结构,下一次调用可以只使用它的 id 属性。一旦通信变得复杂,就几乎无法使用 json 作为参数。
  • 另一个想法是使用 Lens,正如 Chris Eidhof 在 Lenses in Swift 中解释的那样.

关于swift - FRP 星际、转换、链接信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33822328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com