iOS-核心数据-成功创建/打开之前

iOS-核心数据-成功创建/打开之前,ios,core-data,uimanageddocument,Ios,Core Data,Uimanageddocument,概述 我有一个iOS项目,其中我在表视图中存储了一个名称列表 我知道在打开/创建数据库的那一刻,就有一个完成处理程序来执行一个方法 步骤: 在我的例子中,第一个屏幕是显示名称的表视图 导航栏上有一个+按钮,用于添加一个新名称,该名称将带到新屏幕以输入详细信息 担忧 我担心的是,如果我在完成处理程序中获取tableview的名称,并且如果用户不等待数据库打开并在保存时创建新名称,则可能无法打开/创建数据库 问题 如何处理这种情况 我错过什么了吗 处理这种情况的一种(简单)方法是添加一个计时器,等待

概述

我有一个iOS项目,其中我在表视图中存储了一个名称列表

我知道在打开/创建数据库的那一刻,就有一个完成处理程序来执行一个方法

步骤:

  • 在我的例子中,第一个屏幕是显示名称的表视图
  • 导航栏上有一个+按钮,用于添加一个新名称,该名称将带到新屏幕以输入详细信息
  • 担忧

    我担心的是,如果我在完成处理程序中获取tableview的名称,并且如果用户不等待数据库打开并在保存时创建新名称,则可能无法打开/创建数据库

    问题

  • 如何处理这种情况
  • 我错过什么了吗

  • 处理这种情况的一种(简单)方法是添加一个计时器,等待数据库打开/创建。您还可以灰显按钮(+按钮),直到数据库准备就绪。

    好的,一种(简单)处理这种情况的方法是添加一个计时器,等待数据库打开/创建。在数据库准备就绪之前,您也可以将按钮(+按钮)灰显。

    实际上,在初始化所有内容之前,您不应该允许用户更改内容。如果需要一段时间,那么只需禁用该功能,直到准备就绪

    在这种情况下很容易。从禁用“添加”按钮开始,并在完成处理程序中启用它

    您可以编写documentIsReady方法(该方法将启用编辑,以及在“一切就绪”时要执行的任何其他操作),然后在文档准备好使用时调用它。例如,请参见下面的代码

        if (![[NSFileManager defaultManager] fileExistsAtPath:[doc.fileURL path]]) {
            [doc saveToURL:doc.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
                [self documentIsReady: success];
            }];
        } else if (doc.documentState == UIDocumentStateClosed) {
            [doc openWithCompletionHandler:^(BOOL success) {
                [self documentIsReady: success];
            }];
        } else {
            BOOL success = doc.documentState == UIDocumentStateNormal;
            [self documentIsReady: success];
        }
    

    实际上,在初始化所有内容之前,您不应该允许用户更改内容。如果需要一段时间,那么只需禁用该功能,直到准备就绪

    在这种情况下很容易。从禁用“添加”按钮开始,并在完成处理程序中启用它

    您可以编写documentIsReady方法(该方法将启用编辑,以及在“一切就绪”时要执行的任何其他操作),然后在文档准备好使用时调用它。例如,请参见下面的代码

        if (![[NSFileManager defaultManager] fileExistsAtPath:[doc.fileURL path]]) {
            [doc saveToURL:doc.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
                [self documentIsReady: success];
            }];
        } else if (doc.documentState == UIDocumentStateClosed) {
            [doc openWithCompletionHandler:^(BOOL success) {
                [self documentIsReady: success];
            }];
        } else {
            BOOL success = doc.documentState == UIDocumentStateNormal;
            [self documentIsReady: success];
        }
    

    谢谢,我有一个疑问,添加一个NSTimer必须在一个单独的线程中,还是可以在同一个线程中,因为完成处理程序是异步执行的?NSTimer都是在一个高速线程中运行的。这就是如何在oncethanks上运行2个计时器的方法,我有一个疑问,添加一个NSTimer是否必须在一个单独的线程中,或者它是否可以在同一个线程中,因为完成处理程序是异步执行的?NSTimer是在一个高速线程中运行的,都是由它们自己运行的。这就是如何一次运行2个计时器异步获取联系人列表的方法?Ad,您所说的“打开/创建数据库”是什么意思?如果获取smth,则必须已经创建核心数据数据库,并且您真的不需要关心它是否“打开”。谢谢,如果数据库文件存在,然后我将使用UIManagedDocument的方法openWithCompletionHandler打开它:。。。如果它没有打开,我将使用saveToURL方法创建一个新的DB文件。由于完成处理程序是异步执行的,因此用户可能能够在不打开数据库的情况下添加数据。您最好让他等待一段时间,直到创建完所有内容。在完成处理程序中添加一个按钮。您是否异步获取联系人列表?Ad,“打开/创建数据库”是什么意思?如果您获取smth,则必须已经创建核心数据数据库,并且您真的不需要关心它是否“打开”。谢谢,如果数据库文件存在,那么我将使用UIManagedDocument的方法openWithCompletionHandler:。。。如果它没有打开,我将使用saveToURL方法创建一个新的DB文件。由于完成处理程序是异步执行的,因此用户可能能够在不打开数据库的情况下添加数据。您最好让他等待一段时间,直到创建完所有内容。在完成处理程序中添加一个淡入淡出的UIButton谢谢,是使用UIDocumentStateChangedNotification完成的吗(添加要执行的观察者和传递选择器)?不,您可以在完成处理程序中执行。我将用一个伪示例编辑答案。太棒了!!!非常感谢Jody,非常有用,代码干净,没有我想象的那么复杂!!再次感谢Hanks,是使用UIDocumentStateChangedNotification完成的吗(添加要执行的观察者和传递选择器)?不,您可以在完成处理程序中执行。我将用一个伪示例编辑答案。太棒了!!!非常感谢Jody,非常有用,代码干净,没有我想象的那么复杂!!再次感谢