【问题标题】:MagicalRecord saveToPersistentStoreWithCompletion seems to happen more than once causing a lot of lag/ui blockingMagicalRecord saveToPersistentStoreWithCompletion 似乎不止一次发生,导致大量延迟/用户界面阻塞
【发布时间】:2014-01-15 15:37:17
【问题描述】:

我正在尝试使用 MagicalRecord 一次导入大量实体,但 saveToPersistentStoreWithCompletion 在控制台内打印了多次,并且需要很长时间才能完成。

这是存档!

[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) {
        NSLog(@"Saved the database changes");
}];

我很欣赏有大量的项目要保存,但 MagicalRecord 保存多个相同信息的上下文是否是正常行为?如果是这样,我可以让它在后台简单地保存一个上下文吗?

提前感谢您的帮助。

-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x18df55f0) → Saving <NSManagedObjectContext (0x18df55f0): *** UNNAMED ***> on *** BACKGROUND THREAD ***
-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x18df55f0) → Save Parents? 1
-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x18df55f0) → Save Synchronously? 0
-[NSManagedObjectContext(MagicalRecord) MR_contextWillSave:](0x18df55f0) Context UNNAMED is about to save. Obtaining permanent IDs for new 18677 inserted objects
-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x1765c3f0) → Saving <NSManagedObjectContext (0x1765c3f0): *** DEFAULT ***> on *** BACKGROUND THREAD ***
-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x1765c3f0) → Save Parents? 1
-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x1765c3f0) → Save Synchronously? 0
-[NSManagedObjectContext(MagicalRecord) MR_contextWillSave:](0x1765c3f0) Context DEFAULT is about to save. Obtaining permanent IDs for new 18677 inserted objects
-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x1765de80) → Saving <NSManagedObjectContext (0x1765de80): *** BACKGROUND SAVING (ROOT) ***> on *** MAIN THREAD ***
-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x1765de80) → Save Parents? 1
-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x1765de80) → Save Synchronously? 0
-[NSManagedObjectContext(MagicalRecord) MR_contextWillSave:](0x1765de80) Context BACKGROUND SAVING (ROOT) is about to save. Obtaining permanent IDs for new 18677 inserted objects
__70-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:]_block_invoke25(0x1765de80) → Finished saving: <NSManagedObjectContext (0x1765de80): *** BACKGROUND SAVING (ROOT) ***> on *** BACKGROUND THREAD ***

更新 1:

我刚刚发现使用以下方法可以大大加快时间,但似乎仍然可以节省 3 倍。

[MagicalRecord saveUsingCurrentThreadContextWithBlock:^(NSManagedObjectContext *localContext){
} completion:^(BOOL success, NSError *error){
    NSLog(@"Saved the database changes");
}];

【问题讨论】:

    标签: objective-c nsmanagedobjectcontext magicalrecord


    【解决方案1】:

    由于您使用指定方法执行的任何保存操作都在 mainThread 上执行任务,这就是您看到 UI 阻塞和滞后的原因。

    如果您返回文件MagicalRecord+Actions.h 并验证,那么您会发现其他适用于backgroundThread 的方法,即:

    + (void) saveWithBlock:(void(^)(NSManagedObjectContext *localContext))block;

    + (void) saveWithBlock:(void(^)(NSManagedObjectContext *localContext))block completion:(MRSaveCompletionHandler)completion;

    尝试使用它,它将避免mainThread 阻塞,因为操作将在后台线程中执行。

    希望对您有所帮助。

    【讨论】:

    • 使用此方法不保存数据! NSLog 说:- [NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x1d205090) **未命名**上下文没有变化 - 没有保存
    • @WillRoberts 目前正确的解决方案是什么?我也想使用这种方法,但看起来它没有使用正确的上下文。
    猜你喜欢
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2023-03-17
    • 2018-03-17
    相关资源
    最近更新 更多