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]
每当 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]