Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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_Objective C_Core Data_Nsmanagedobjectcontext_Save - Fatal编程技术网

Ios 为什么核心数据保存一个对象要花这么长时间?

Ios 为什么核心数据保存一个对象要花这么长时间?,ios,objective-c,core-data,nsmanagedobjectcontext,save,Ios,Objective C,Core Data,Nsmanagedobjectcontext,Save,在我的实体类别中,我有一个简单的方法,它将自定义方法添加到我的子类NSManagedObject类中(由于自动生成子类,所以我不接触这些类) 我有一个从MOC中删除对象并保存上下文的方法 + (void)deleteWishlist:(Wishlist *)wishlist inManagedObjectContext:(NSManagedObjectContext *)context { [context deleteObject:wishlist]; NSErro

在我的实体类别中,我有一个简单的方法,它将自定义方法添加到我的子类
NSManagedObject
类中(由于自动生成子类,所以我不接触这些类)

我有一个从MOC中删除对象并保存上下文的方法

+ (void)deleteWishlist:(Wishlist *)wishlist
    inManagedObjectContext:(NSManagedObjectContext *)context
{

    [context deleteObject:wishlist];

    NSError *error;
    if(![context save:&error]) {
        NSLog(@"%@", error);
    } else {
        NSLog(@"Delete successful");
    }
}
我从我的一个视图控制器调用它,如下所示:

- (void)deleteWishlist:(Wishlist *)wishlist
{
    if(wishlist) {
        [Wishlist deleteWishlist:wishlist inManagedObjectContext:self.managedObjectContext];
    }
}
它从UI事件处理方法(委托
tableView:committeeditingstyle:forRowAtIndexPath:
method)调用

现在,这一切都正常,但保存对象需要很长时间……我不知道这是否是默认行为,但我希望它在从图形中删除后立即将保存到持久存储中。我不介意我是否要等到它救了我

在iOS模拟器上,如果我点击“停止”,然后再次加载我的应用程序,愿望列表仍然存在。如果我按下home按钮,应用程序将进入后台模式,并在那里保存它…但它似乎保存了两次。老实说,我不知道它第一次在做什么

2013-05-29 00:45:14.819 App[29024:c07] [WishlistCDTVC setFetchedResultsController:] set
2013-05-29 00:45:14.820 App[29024:c07] [WishlistCDTVC performFetch] fetching all Wishlist (i.e., no predicate)
2013-05-29 00:45:15.755 App[29024:c07] Delete pressed
2013-05-29 00:45:16.666 App[29024:c07] NSManagedObjects did change.
2013-05-29 00:45:16.669 App[29024:c07] NSManagedContext did save.
2013-05-29 00:45:16.670 App[29024:c07] Delete successful
2013-05-29 00:45:19.119 App[29024:c07] NSManagedContext did save.

我所做的:加载愿望列表VC,滑动删除,确认,它说“删除按下”。从上下文中删除对象,保存它(,但显然不是这里的),然后说删除成功(所以没有错误),然后我点击主页按钮,它记录最后一行“保存”,最后保存到持久存储。那么为什么中间的一个不保存呢?

简单修复,我现在总是在对上下文进行任何更改后保存
NSManagedDocument
(我不需要撤消功能)

在我的共享文档处理程序类中,我告诉它保存更改通知

- (void)objectsDidChange:(NSNotification *)notification
{
    #ifdef DEBUG
        NSLog(@"NSManagedObjects did change.");
    #endif
    [BSDocumentHandler saveDocument];
}
saveDocument
只是一个类方法:

+ (void)saveDocument
{
    UIManagedDocument *document = [[BSDocumentHandler sharedDocumentHandler] document];
    [document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:nil];
}
它现在立即保存,当我使用stop停止模拟器时,它现在保存保存

此外,为了避免重复保存,我现在在创建、编辑或删除对象后删除了包含托管对象上下文保存的所有行,并且我的共享文档处理程序类自动管理所有保存,从而减少了代码的重复

我的日志现在干净多了。这是执行删除操作。我调用列出所有项目的VC,滑动以删除,然后确认。它注意到MOC发生了更改,并保存了一次文档(如预期的那样)


@MikePallard我使用的是相同的共享上下文。你的模型呢?你有多少威士忌?愿望列表是否链接到其他实体?如果是,您是否设置了级联规则?
2013-05-30 13:33:01.310 App[27167:c07] [ItemCDTVC setFetchedResultsController:] set
2013-05-30 13:33:01.312 App[27167:c07] [ItemCDTVC performFetch] fetching all Item (i.e., no predicate)
2013-05-30 13:33:04.735 App[27167:c07] NSManagedObjects did change.
2013-05-30 13:33:04.751 App[27167:c07] NSManagedContext did save.