Swift合并:Return先本地数据再远程数据

Swift Combine: Return local data first and then remote data

每当 usecase 从存储库调用任何方法时,它应该 return 首先保存在核心数据中的数据,然后开始从远程服务器获取数据。一旦存储库从远程服务器接收到数据,它应该在本地数据库中更新并发出包含最新数据的新事件。

如何使用 Swift 合并?

Class UsersRepository {

  func fetchUsers() -> AnyPublisher<[Users], Error> {

     1. Emit Users from local DB
     2. Emit Users received from remote server
   }
}

您可以尝试这样的操作:

import Combine

class Repository {

  private let cache: Cache
  private let service: Service

  init(cache: Cache, service: Service) {
    self.cache = cache
    self.service = service
  }

  func fetch() -> AnyPublisher<[Int], Error> {
    return Publishers.Concatenate(
      prefix: cache.fetch(),
      suffix: service.fetch()
        .handleEvents(receiveOutput: {
          self.cache.cache = [=10=]
        })
    ).eraseToAnyPublisher()
  }
}

class Cache {

  var cache: [Int] = [1, 2]

  func fetch() -> AnyPublisher<[Int], Error> {
    return Just(cache)
      .mapError { [=10=] }
      .eraseToAnyPublisher()
  }
}

class Service {
  func fetch() -> AnyPublisher<[Int], Error> {
    return Just([3, 4])
      .mapError { [=10=] }
      .eraseToAnyPublisher()
  }
}

let repo = Repository(cache: Cache(), service: Service())

repo.fetch()
  .sink(
    receiveCompletion: { _ in },
    receiveValue: {
      print([=10=])
    }
  )

repo.fetch()
  .sink(
    receiveCompletion: { _ in },
    receiveValue: {
      print([=10=])
    }
  )

// PRINTS:
// [1, 2]
// [3, 4]
// [3, 4]
// [3, 4]