使用 PromiseKit 6 在 Swift 4.2 中缓存
Posted
技术标签:
【中文标题】使用 PromiseKit 6 在 Swift 4.2 中缓存【英文标题】:Caching in Swift 4.2 using PromiseKit 6 【发布时间】:2018-11-02 23:41:13 【问题描述】:我遇到了两个错误:
pending = endpoint().then freshValue in
导致错误:“无法推断复杂的闭包返回类型;添加显式类型以消除歧义”
return Guarantee(cachedValue) as! Guarantee<t>
导致错误:“无法将类型 'T' 的值转换为预期的参数类型 'PMKUnambiguousInitializer'”
这在 Swift 2 中工作(此后略有编辑),但是自从更新到 Swift 4.2 后,此代码开始中断。我承认,我仍在尝试找出从 Promisekit 4 到 6 的所有变化。
下面是剩下的代码:
import Foundation
import PromiseKit
class CachedValue<T>
var date = NSDate.distantPast
var value: T? didSet date = NSDate() as Date
class Cache<T>
private let defaultMaxCacheAge: TimeInterval
private let defaultMinCacheAge: TimeInterval
private let endpoint: () -> Guarantee<T>
private let cached = CachedValue<T>()
private var pending: Guarantee<T>?
// Always makes API request, without regard to cache
func fresh() -> Guarantee<T>
// Limit identical API requests to one at a time
if pending == nil
pending = endpoint().then freshValue in
self.cached.value = freshValue
return Promise(freshValue)
.ensure
self.pending = nil
as! Guarantee<T>
return pending!
// If cache too old (invalid), returns nil
func cachedOrNil(maxCacheAge: TimeInterval) -> T?
// maxCacheAge is maximum cache age before cache is deleted
if NSDate().timeIntervalSince(cached.date) > maxCacheAge
cached.value = nil
return cached.value
// If cache nil too old (stale), makes API request
func cachedOrFresh(maxCacheAge: TimeInterval, minCacheAge: TimeInterval) -> Guarantee<T>
// minCacheAge is minimum cache age before API request is made
if let cachedValue = cachedOrNil(maxCacheAge: maxCacheAge)
if NSDate().timeIntervalSince(cached.date) < minCacheAge
return Guarantee(cachedValue) as! Guarantee<T>
return fresh()
/// ... More code in file...
【问题讨论】:
【参考方案1】:这里你需要通过指定具体类型来提供then
块的返回类型,例如MyClass
,如下所示,
pending = endpoint().then freshValue -> Guarantee<MyClass> in ...
【讨论】:
以上是关于使用 PromiseKit 6 在 Swift 4.2 中缓存的主要内容,如果未能解决你的问题,请参考以下文章
使用 PromiseKit 从 Objective C 到 Swift 的桥接
如何在 Swift 中使用 PromiseKit 和 Firebase?
如何使用 Combine + Swift 复制 PromiseKit 风格的链式异步流