简单的未来链,具有不同的值类型,使用Combine。

问题描述 投票:1回答:1

我想应用的逻辑是。

如果我们已经导入了用户,我们只需要获取他们,否则先导入用户,然后再获取他们。这是我的尝试。

import Combine

struct User {
    let name: String
}

var didAlreadyImportUsers = false

// Import the users and return true of false 
var importUsers: Future<Bool, Never> {
    Future { promise in
        promise(.success(true))
    }
}

var fetchUsers: Future<[User], Error> {
    Future { promise in
        promise(.success([User(name: "John"), User(name: "Jack")]))
    }
}

var users: Future<[User], Error> {
    if didAlreadyImportUsers {
        return fetchUsers
    } else {
        return importUsers.setFailureType(to: Error.self)
            .combineLatest(fetchUsers)
            .map { $0.1 }
    }
}

我得到一个错误。

Cannot convert return expression of type
'Publishers.Map<Publishers.CombineLatest<Publishers.SetFailureType<Future<Bool, Never>, Error>, Future<[User], Error>>, [User]>' 
to return type 'Future<[User], Error>'

Any idea how to get the result of chaining as Future<[User], Error> ?

ios swift future combine
1个回答
1
投票

很接近了! 只要擦掉类型就可以了。

var users: AnyPublisher<[User], Error> {
    if didAlreadyImportUsers {
        return fetchUsers.eraseToAnyPublisher()
    } else {
        return importUsers.setFailureType(to: Error.self)
            .combineLatest(fetchUsers)
            .map { $0.1 }.eraseToAnyPublisher()
    }
}

你可能会说: 等等,我说的不是这样做,我想把它作为一个Future返回。好吧。不要 要的!它 是不是 你不想知道它是什么。你只想知道它的输出类型和失败类型。

这里的重点是,一个出版商和另一个出版商一样好;它们可以互换使用。只要它们的类型符合. 这就是为什么要提供AnyPublisher的原因:它是为了让你可以做到这一点。基本上,AnyPublisher就是你在出版商类型之间的投稿方式:你只需将所有的东西投稿到AnyPublisher。

© www.soinside.com 2019 - 2024. All rights reserved.