函数不 return true 除非我在需要它之前调用它一次
function doesn't return true unless I call it once before I need it
我有一个名为 iCloudIsOn() 的函数,它通过将 UserDefaults 键的值与预定义键的值进行比较来检查用户是否选择将 iCloud 与应用程序一起使用,然后我在我的初始视图控制器上使用它同步 iCloud 并实现下拉刷新,但前提是用户正在使用 iCloud,否则不需要此代码。
然而,奇怪的是,如果我在需要使用它之前调用它,即使只有一个 print(iCloudIsOn())
函数也只有 return 为真
函数本身如下所示:
func iCloudIsOn() -> Bool {
if UserDefaults.standard.url(forKey: "UDDocumentsPath") == iCloudPath { return true }
else { return false }
}
然后在我初始的viewDidLoad下vc:
override func viewDidLoad() {
super.viewDidLoad()
if iCloudIsOn() {
// sync iCloud
}
}
但是这不会起作用,那时 iCloudIsOn() 将 return 为假,除非我在 if iCloudIsOn() 之前添加 print(iCloudIsOn()) { // 同步 iCloud }
我试着让 iCloudIsOn 在每次调用时打印 UserDefaults 键和 iCloudPath 的值,它们总是相同的:file:///private/var/mobile/Library/Mobile%20Documents/iCloud~cristian~thrive-storage/Documents/
所以我的代码中没有任何东西在某些时候改变其中之一的值(该值打印在 return 之前)。
知道为什么会这样吗?这与 UD 的工作方式有关,还是我遗漏了其他东西?我觉得有点奇怪,但我确定我只是在某个地方犯了错误。
提前致谢。
问题最终是 UserDefaults 第一次存储一个没有“/”的值,当与原始 URL、iCloudPath
、iCloudPath
进行比较时"/".
UserDefaults.standard.url(forKey: "UDDocumentsPath") = someURL
iCloudPath = someURL/
这只会在第一次复飞时发生。解决方法是同时覆盖这两个基础,因为您不知道自己在哪个基础上,尤其是当您在应用程序的一个会话中进行多项检查时。
if UserDefaults.standard.url(forKey: "UDDocumentsPath") == iCloudPath || UserDefaults.standard.url(forKey: "UDDocumentsPath").appendPathComponent("/") == iCloudPath
不过,从技术上讲,这是一种奇怪且意外的行为。
我有一个名为 iCloudIsOn() 的函数,它通过将 UserDefaults 键的值与预定义键的值进行比较来检查用户是否选择将 iCloud 与应用程序一起使用,然后我在我的初始视图控制器上使用它同步 iCloud 并实现下拉刷新,但前提是用户正在使用 iCloud,否则不需要此代码。
然而,奇怪的是,如果我在需要使用它之前调用它,即使只有一个 print(iCloudIsOn())
函数也只有 return 为真函数本身如下所示:
func iCloudIsOn() -> Bool {
if UserDefaults.standard.url(forKey: "UDDocumentsPath") == iCloudPath { return true }
else { return false }
}
然后在我初始的viewDidLoad下vc:
override func viewDidLoad() {
super.viewDidLoad()
if iCloudIsOn() {
// sync iCloud
}
}
但是这不会起作用,那时 iCloudIsOn() 将 return 为假,除非我在 if iCloudIsOn() 之前添加 print(iCloudIsOn()) { // 同步 iCloud }
我试着让 iCloudIsOn 在每次调用时打印 UserDefaults 键和 iCloudPath 的值,它们总是相同的:file:///private/var/mobile/Library/Mobile%20Documents/iCloud~cristian~thrive-storage/Documents/
所以我的代码中没有任何东西在某些时候改变其中之一的值(该值打印在 return 之前)。
知道为什么会这样吗?这与 UD 的工作方式有关,还是我遗漏了其他东西?我觉得有点奇怪,但我确定我只是在某个地方犯了错误。
提前致谢。
问题最终是 UserDefaults 第一次存储一个没有“/”的值,当与原始 URL、iCloudPath
、iCloudPath
进行比较时"/".
UserDefaults.standard.url(forKey: "UDDocumentsPath") = someURL
iCloudPath = someURL/
这只会在第一次复飞时发生。解决方法是同时覆盖这两个基础,因为您不知道自己在哪个基础上,尤其是当您在应用程序的一个会话中进行多项检查时。
if UserDefaults.standard.url(forKey: "UDDocumentsPath") == iCloudPath || UserDefaults.standard.url(forKey: "UDDocumentsPath").appendPathComponent("/") == iCloudPath
不过,从技术上讲,这是一种奇怪且意外的行为。