【问题标题】:function doesn't return true unless I call it once before I need it除非我在需要之前调用它一次,否则函数不会返回 true
【发布时间】:2019-09-07 15:43:12
【问题描述】:

我有一个名为 iCloudIsOn() 的函数,它通过将 UserDefaults 键的值与预定义的键的值进行比较来检查用户是否选择在应用程序中使用 iCloud,然后我在我的初始视图控制器上使用它来同步iCloud并实现pull刷新,但前提是用户正在使用iCloud,否则不需要此代码。

然而奇怪的是,如果我在需要使用它之前调用它,该函数只会返回 true,即使只使用 print(iCloudIsOn())

函数本身如下所示:

func iCloudIsOn() -> Bool {    
    if UserDefaults.standard.url(forKey: "UDDocumentsPath") == iCloudPath { return true }
    else { return false }
}

然后在我的初始vc的viewDidLoad下:

override func viewDidLoad() {
    super.viewDidLoad()

    if iCloudIsOn() {
        // sync iCloud
    }
}

但是这不起作用,除非我在 if iCloudIsOn() { // 同步 iCloud }

之前添加 print(iCloudIsOn())

我尝试让 iCloudIsOn 在每次调用时都打印 UserDefaults 键和 iCloudPath 的值,它们总是相同的:file:///private/var/mobile/Library/Mobile%20Documents/iCloud~cristian~繁荣存储/文档/

因此,我的代码中没有任何内容会在某些时候更改其中一个的值(该值在返回之前打印)。

知道为什么会这样吗?这与UD的工作方式有关还是我错过了其他东西?我觉得这有点奇怪,但我确定我只是在某个地方犯了错误。

提前致谢。

【问题讨论】:

  • 看不到你所有的代码,所以我只是在思考——你是否异步地做任何影响if UserDefaults.standard.url(forKey: "UDDocumentsPath") == iCloudPath { return true }的事情,这样它会是false之前的时刻,然后是你打第二个电话时,它返回true。即,数据还没有准备好?或者您的iCouldPath 直到第二次才设置?我知道你打印iCloudPath,但这可能不是你的问题。您的问题可能是UserDefaults.standard.url(forKey: "UDDocumentsPath"),所以我会在第一次和第二次查看该变量
  • 嘿@impression7vx 我尝试打印两者,所以我将函数更改为打印 UserDefaults.standard.url(forKey: "UDDocumentsPath") 和 iCloudPath。我想分享控制台日志的屏幕截图,我意识到第一个日志有一个额外的“/”,但这不应该发生,因为我从不手动更改 UserDefaults 值,我总是将 iCloudPath 分配给它。 dropbox.com/s/z423n7leo2fzvid/…
  • 这是我分配值的方式: if iCloudIsAvailable() { UserDefaults.standard.set(iCloudPath, forKey: "UDDocumentsPath") } 和 iCloudPath 让 iCloudPath = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents")
  • 但是你什么时候打电话?
  • 那么,您可以添加显示所有打印语句的代码和工作流程吗?在您的图像中,您显示打印语句,但它与当前代码无关。

标签: swift nsuserdefaults control-flow userdefaults


【解决方案1】:

问题最终是当与原始 URL 比较时,UserDefaults 第一次存储的值没有“/”,iCloudPathiCloudPath 具有原始“/”。

UserDefaults.standard.url(forKey: "UDDocumentsPath") = someURL

iCloudPath = someURL/

这只会在第一次运行时发生。解决方法是覆盖这两个基础,因为您不知道自己在哪一个,尤其是当您在应用程序的一个会话中进行多项检查时。

if UserDefaults.standard.url(forKey: "UDDocumentsPath") == iCloudPath || UserDefaults.standard.url(forKey: "UDDocumentsPath").appendPathComponent("/") == iCloudPath

不过,从技术上讲,这是一种奇怪且出乎意料的行为。

【讨论】:

    猜你喜欢
    • 2020-10-27
    • 2020-03-04
    • 2023-02-06
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2018-06-13
    相关资源
    最近更新 更多