我正试图在我的spritekit游戏中保存高分。根据我看过的所有教程和我读过的堆栈溢出答案,以下代码应该可以工作:
NSUserDefaults.standardUserDefaults().setInteger(highScore, forKey: "highScore")
NSUserDefaults.synchronize()
但是我一直遇到
的错误NSUserDefaults.synchronize()
部分。错误状态“在调用中缺少参数#1的参数”我看过的所有地方似乎都使用该代码而没有错误。我知道最近会有/更新swift。此更新是否会导致使用同步功能更改某些内容,我该如何解决此问题?
答案 0 :(得分:3)
synchronize
是实例方法,因此您应该在实例上调用它,而不是类:
NSUserDefaults.standardUserDefaults().synchronize()
但是,你不应该这样做。
在CoreFoundation release notes for OS X 10.8中,有人说:
CFPreferences同步
CFPreferencesSynchronize()
(因此CFPreferencesAppSynchronize()
和-[NSUserDefaults synchronize]
)现在几乎在所有情况下都是自动的。调用它的唯一原因是,如果您需要一个单独的进程才能同步访问您刚刚设置的值;例如,如果您设置了首选项,则发布另一个进程接收的通知并读取相同的首选项。大多数常规应用程序永远不需要这样做,鼓励使用进程间通信API(例如XPC)的应用程序与其他进程通信,而不是使用IPC的首选项系统。
CFPreferencesSynchronize()
在10.8中也快得多,如果没有未完成的读写更改,将会避免做任何工作。
Foundation release notes for 10.9:
- [NSUserDefaults synchronize]通常不常用
如果单独的应用程序将读取您刚刚设置的默认值,或者如果不使用AppKit的进程正在终止,则您只需要调用
-synchronize
。在大多数应用程序中,这些都不应该发生,并且不应该调用-synchronize
。请注意,在Mac OS X 10.8.4之前,有一个错误导致AppKit在应用程序终止期间稍微过早地自动同步,因此在应用程序终止时响应窗口关闭而设置的首选项可能无法保存;这已得到修复。