Swift Combine - префикс издателя по массиву - PullRequest
0 голосов
/ 23 января 2020

Я играю с издателями в 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)

1 Ответ

0 голосов
/ 27 января 2020

Вы можете использовать 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, представляет собой массив, содержащий только два элемента.

...