iOS-核心数据-成功创建/打开之前
概述 我有一个iOS项目,其中我在表视图中存储了一个名称列表 我知道在打开/创建数据库的那一刻,就有一个完成处理程序来执行一个方法 步骤:iOS-核心数据-成功创建/打开之前,ios,core-data,uimanageddocument,Ios,Core Data,Uimanageddocument,概述 我有一个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,非常有用,代码干净,没有我想象的那么复杂!!再次感谢