Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 每秒保存一次核心数据性能_Ios_Swift_Core Data - Fatal编程技术网

Ios 每秒保存一次核心数据性能

Ios 每秒保存一次核心数据性能,ios,swift,core-data,Ios,Swift,Core Data,情况如下: 我正在开发一个应用程序,该应用程序希望更新我的NSManagedObject子类中特定音频/可视项目(如歌曲或视频)的duration属性。这些信息很重要,因此需要尽可能准确 解决方案1是在项目完成播放后更新此项,但是如果用户从内存终止应用程序,无论它们是在前台还是后台,那么这将引入另一个关于如何处理的问题 解决方案2(似乎绝对是最简单的解决方案)是通过计时器每秒更新此单持续时间属性,就像updateDuration方法中的核心数据逻辑一样: updateTimer = Timer.

情况如下:

我正在开发一个应用程序,该应用程序希望更新我的NSManagedObject子类中特定音频/可视项目(如歌曲或视频)的duration属性。这些信息很重要,因此需要尽可能准确

解决方案1是在项目完成播放后更新此项,但是如果用户从内存终止应用程序,无论它们是在前台还是后台,那么这将引入另一个关于如何处理的问题

解决方案2(似乎绝对是最简单的解决方案)是通过计时器每秒更新此单持续时间属性,就像updateDuration方法中的核心数据逻辑一样:

updateTimer = Timer.every(1.0, {
     self.updateDuration(for: self.itemNeedingUpdate)
})
RunLoop.current.add(updateTimer!, forMode: RunLoopMode.commonModes)

我的问题是“这是一件坏事吗?”所有保存操作都在后台线程上处理,如果项目暂停或停止,则计时器也会停止。因此,只有在实际收听或观看项目时才会触发保存操作。我已经在我的项目中对此进行了测试,而且这种方法似乎没有任何性能问题。然而,这在我的脑海中升起了一面红旗。我很想听听任何人对这个特定解决方案的见解。

我只想将您的数据保存在
应用程序willterminate
(在您的AppDelegate类中),因为它将在应用程序即将终止时被调用,而不管它是否在后台

它也可以满足您的视频需求

func applicationWillTerminate(application: UIApplication) {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.

    saveData()
}
节省每一秒只是对线程的一种不好的使用,这是不必要的

编辑:

我应该让自己更清楚,当应用程序在后台时,上面的方法并不总是被调用。解决此问题的一个简单方法是每次应用程序进入后台时都保存数据:

func applicationDidEnterBackground(application: UIApplication) {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.

    saveData()
}

我在app Store上为自己的iOS应用程序使用此方法,并且没有任何问题。即使节省每一秒都不会显著影响应用程序的性能,但这似乎是不必要的。

我不确定自己是否完全理解你的应用程序在做什么。但是,为了维护将不断变化的用户数据,是否每秒保存一次?我会毫不犹豫地这么做。

您看过Xcode上的RAM和CPU测试功能了吗?它们正常吗?@BenjaminLowry RAM和CPU似乎没有受到影响。计时器被触发时,CPU的范围在2-4%之间。即使应用程序被强制退出,您的应用程序也会收到关闭的通知,因此为什么不更新核心数据呢?@mthud这些通知不可靠,可能不会发生。只有当应用程序是当前运行的应用程序时,用户终止应用程序时才会调用此方法。如果在应用程序处于后台时终止应用程序,或者如果系统终止应用程序以释放内存,则不会调用此方法@dhint4是的,谢谢你提出来,我忘记解释了。请看我编辑的帖子。汤姆,我只是想澄清一下,你说我提出的解决方案似乎合乎逻辑,可以吗?是的,这就是为什么我会毫不犹豫地使用它的原因。