基于缓存的值可用性运行方法

时间:2018-03-24 18:59:26

标签: ios swift asynchronous request

我有以下情况:

if UserDefaults.standard.bool(forKey: "foo") == nil {
     asyncRequest() { foo in
         myMethod(foo)
     }
} else {
      myMethod(foo)
}

我基本上都在检查此时是否缓存了foo变量。如果不是,我从服务器上获取它,但是如果我有它,我会直接调用该方法。

是否有更好的做法可以避免在这里使用if-else语句? (例如,允许我仅拨打myMethod(foo)一次的内容)

2 个答案:

答案 0 :(得分:0)

这似乎是对的,请注意bool(forKey :)将始终返回bool,而不是可选。为此你应该使用value(forKey :)。你也可以做这样的事情

var foo: Bool? {
    return UserDefaults.standard.value(forKey: "foo") as? Bool
}

func assignValue() {
    guard let foo = foo else {
        // your async call here
        return
    }
    myMethod(foo)

}

答案 1 :(得分:0)

我解决了这个问题:

let group = DispatchGroup()

if UserDefaults.standard.bool(forKey: "foo") == nil {
     group.enter()

     asyncRequest() { foo in
         UserDefaults.standard.set(bool: foo, forKey: "foo")
         group.leave()
     }
} 

group.notify(queue: .main) {
      let foo = UserDefaults.standard.set(bool: foo, forKey: "foo")
      myMethod(foo)
}

这个想法是在两种情况下都会触发group.notify()