【问题标题】:What is the best place to close a sqlite3 connection in obj-c?在 obj-c 中关闭 sqlite3 连接的最佳位置是什么?
【发布时间】:2011-12-13 10:56:39
【问题描述】:

我在 AppDelegate.m 中打开数据库连接

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

我正在关闭applicationWillTerminate

- (void)applicationWillTerminate:(UIApplication *)application
{
    /*
     Called when the application is about to terminate.
     Save data if appropriate.
     See also applicationDidEnterBackground:.
     */
    NSLog(@"Closing DB");
    if(database) sqlite3_close(database);
}

但是当我关闭(真正关闭)模拟器上的应用程序时,我没有在控制台中看到日志“Closing DB”。正常吗?

在 Objective-c 中关闭 sqlite3 连接的最佳位置是什么?

(真的很接近的意思

– 双击主页按钮以调出多任务栏 – 按住多任务栏上的任意位置,直到其上的图标开始摆动。 – 当它们摆动时,每个图标上方都有一个减号符号。 – 按任何应用程序上方的减号将其关闭。)

【问题讨论】:

    标签: objective-c ios xcode sqlite


    【解决方案1】:

    这是因为您的应用程序没有终止。它进入了背景。尝试将您的代码添加到 applicationDidEnterBackground

    【讨论】:

    • 我按照以下步骤操作“– 双击主页按钮以调出多任务栏 – 按住多任务栏上的任意位置,直到其上的图标开始摆动。 – 当它们摆动时,每个图标上方有一个减号符号。 - 按任何应用程序上方的减号符号将其关闭。”即使关注他们我也没有看到日志输出。
    • 您是否尝试将代码放入 applicationDidEnterBackground ?
    【解决方案2】:

    尽量避免使用 -applicationWillTerminate: 方法,因为您没有足够的时间(!)正确地完成您的工作 - 可能系统正在重新启动或关闭。保存数据和清除未使用资源(如果需要)的最佳做法是将代码放入 -applicationDidEnterBackground: 方法中。

    来自 Apple 的 UIApplicationDelegate 协议参考:

    您实施此方法的时间大约为 5 秒 执行任何任务并返回。如果您需要额外的时间来执行 任何最终任务,您都可以从 系统通过调用 beginBackgroundTaskWithExpirationHandler:。在 练习,你应该从 applicationDidEnterBackground: 返回 尽快。如果方法在时间运行之前没有返回 你的应用程序被终止并从内存中清除。

    您应该执行与调整用户界面相关的任何任务 在此方法退出之前,但其他任务(例如保存状态)应该 根据需要移动到并发调度队列或辅助线程。 因为它可能是您开始的任何后台任务 applicationDidEnterBackground: 在该方法之后才会运行 退出,您应该在之前请求额外的后台执行时间 开始这些任务。换句话说,首先调用 beginBackgroundTaskWithExpirationHandler: 然后在一个任务上运行 调度队列或辅助线程。

    (c)taken from this answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多