我有一个在后台注册位置更新的应用程序。每当位置更新时,我都需要循环遍历坐标的 NSMutableArray
以查看哪个位置最接近用户。
有时由于内存原因,手机会终止我的应用程序(尽管它仍然注册接收位置更新),以及我的 NSMutableArray
坐标。
因此,无论何时发生位置更新,我都必须检查坐标的 NSMutableArray
是否仍然存在,如果没有,我想从 SQLite 表中重新填充它。
运行一些测试后,似乎没有从 SQLite 表中重新填充我的坐标数组,这是我在位置更新时运行的代码:
bgTask = [[UIApplication sharedApplication]beginBackgroundTaskWithExpirationHandler:^{[[UIApplication sharedApplication] endBackgroundTask:bgTask]}];
if(coordArray == nil || coordArray.count == 0)
{
[self readCoordinatesFromDatabase];
}
else
{
//Check which coordinate is closest to the user.
}
if(bgTask != UIBackgroundTaskInvalid)
{
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
在这种情况下我不允许从 SQLite 读取数据吗?
每当发生位置更新时,我绝对需要能够(在后台)遍历我的坐标数组,即使应用程序在一段时间后被终止,我该如何做到这一点?
最佳答案
猜想你是直接和SQLite对话,没理由不在后台运行。您是直接编写 C 代码来与 SQLite 对话还是使用库?
但是,如果您遇到内存问题,也许您应该将坐标保留在 SQLite 中而不是将它们全部加载到内存中?
或者也许切换到 Core Data,这将极大地帮助解决内存问题并减少您为访问数据而编写的代码量。
将数据存储在 SQLite 中并使用数据库查找附近的坐标比每次有新位置时循环遍历数组要高效得多。
更新1
如果您的应用程序不在前面,它最终会被终止。
如果您正在使用后台位置更新,那么操作系统会尝试让您保持运行,但我们无法保证。
如果你是一个有内存的坏公民,你将被处决。将数据保存在磁盘上而不是内存中将以各种可能的方式提供帮助。它会减少您的内存,让您在操作系统中保持良好状态,并增加您的应用程序在后台运行的机会。
不要将数据保存在内存中,而是将其保存在磁盘上。分析您的应用,使其内存消耗尽可能接近于零。
关于iOS:我可以在后台读取 SQLite 数据库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16839814/