ios - Magical Record 后台保存似乎阻塞了 UI

标签 ios core-data nsoperation magicalrecord

我有一个放在队列中的 NSOperation。 NSOperation 做了一些长时间运行的照片处理,然后我将信息/元数据保存在该照片的核心数据中。在我的自定义 NSOperation 类的主要方法中,我执行以下代码块

-(void)main
{
    //CODE ABOVE HANDLES PHOTO PROCESSING...
    //........

    //THEN I SAVE ALL DATA BELOW LIKE SO
    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {

        Post *post = [Post createInContext:localContext];

        //set about 15 pieces of data, all strings and floats
        post.XXXX = XXXXX;
        post.DDDD = DDDDD;
        etc...
    } completion:^(BOOL success, NSError *error) {
        NSLog(@"Done saving");
    }];
}

我的问题是,即使保存时只有 3 张照片,它也会卡住我的 UI。我本以为在 NSOperation 中执行这个我会没事的。

我应该补充一点,每个 NSOperation 处理一张照片,所以有时队列可能有 5-10 张照片,但我认为这不会有任何区别,即使只有三张照片,就像我说的那样会卡住 UI。

谢谢你的帮助。

更新:------------*------------

我切换到 2.2 版,但这似乎更阻碍了 UI...现在我正在使用

-(void)main
{
    NSManagedObjectContext *localContext = [NSManagedObjectContext    contextForCurrentThread];
    //CODE BELOW HANDLES PHOTO PROCESSING...
    //........

    //THEN I SAVE ALL DATA BELOW LIKE SO
    Post *post = [Post createInContext:localContext];

    //set about 15 pieces of data, all strings and floats
    post.XXXX = XXXXX;
    post.DDDD = DDDDD;


    [localContext saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) {

    }];
}

这一切都是在我的 NSOperation 类中完成的,我做错了什么吗?

最佳答案

不要将 saveWithBlock 调用放在后台线程中。您实际上是在从后台线程创建后台线程,在这种情况下,这只会减慢您的速度。你应该只能调用 saveWithBlock 并且它应该将你所有的保存代码放在后台。但是,我还注意到您在代码的主 UI 页面中进行了所有更改,然后才调用保存。这是这种方法的错误用法。你想做更像这样的事情:

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
    Post *post = [Post createInContext:localContext];

    //photo processing
    //update post from photo processing
} completion:^(BOOL success, NSError *error) {
   //This is called when data is in the store, and is called on the main thread
}];

如果您确实需要 NSOperation,我建议使用不同的模式:

- (void) main {
   NSManagedObjectContext *localContext = [NSManagedObjectContext confinementContext];
  // Do your photo stuff here

  Post *post = [Post createInContext:localContext];
  //more stuff to update post object

  [localContext saveToPersistentStoreAndWait];

}

关于ios - Magical Record 后台保存似乎阻塞了 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17304616/

相关文章:

objective-c - 我可以将不同类型的对象放在同一个 NSMutableArray 中吗?

iOS 最佳性能持久化数据解决方案?

iphone - 核心数据内存泄漏 - iPhone iOS4

objective-c - 我是否需要 Block_copy 传递给 NSOperation 的 setCompletionBlock :? 的 block

iOS Viewcontroller 引用 TableView IBOutlet - 弱还是强?

javascript - Safari window.matchMedia 处理程序未调用

ios - 从 CIRectangleFeature 坐标转换为 View 坐标

ios - NSKeyedArchiver 与核心数据

objective-c - NSOperation 与异步 NSURLConnection

cocoa-touch - 为什么我的 NSOperation 子类永远不会完成?