gpt4 book ai didi

Swift Combine - 数组上的前缀发布者

转载 作者:行者123 更新时间:2023-11-30 10:27:21 25 4
gpt4 key购买 nike

我正在 Swift/Combine 中与发布者一起玩,我有一个函数可以获取 100 条记录并将它们作为数组返回。

作为测试,我只想返回前两项,但它没有像我预期的那样工作,它总是返回 100,我的感觉是,这是因为,第一项是 100 项的数组,如果是的话,如何将它们分开?

import UIKit
import Combine

struct Post : Decodable {
let userId: Int
let id: Int
let title: String
let body: String
}

//let url = URL(string: "https://jsonplaceholder.typicode.com/todos/1")!
let url = URL(string: "https://jsonplaceholder.typicode.com/posts")!

var subscriptions: Set<AnyCancellable> = []

func fetch() -> AnyPublisher<[Post], Never> {
return URLSession.shared.dataTaskPublisher(for: url)
.tryCompactMap{ (arg) -> [Post]? in
let (data, _) = arg
return try JSONDecoder().decode([Post].self, from: data)
}
//.print("here")
.replaceError(with: [])
.eraseToAnyPublisher()
}

fetch()
.prefix(2)
.sink(receiveCompletion: { (comp) in
print("comp: \(comp)")
}) { (res) in
print("Res: \(res.count)")
}.store(in: &subscriptions)

更新,这似乎有效,但不确定语法:

fetch()
.flatMap { Publishers.Sequence(sequence: $0) }
.prefix(2)
.sink(receiveCompletion: { (comp) in
print("comp: \(comp)")
}) { (res) in
print("Res: \(res)")
}.store(in: &subscriptions)

最佳答案

您可以使用map获取完整数组并仅提取您需要的内容。看一下下面的例子:

[Array(0..<100)].publisher.map { array in
return Array(array[..<2])
}.sink(receiveValue: { items in
print(items)
})

这是一个发布包含 100 个值的数组的发布者。然后我使用 array[..<2]创建 ArraySlice包含前两项。然后将该切片转换为 Array这样以后使用起来就更方便了。

items sink 中收到的论点是一个只有两项的数组。

关于Swift Combine - 数组上的前缀发布者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59879487/

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