2014-01-15 5 views
0

MagicalRecord를 사용하여 대량의 엔티티를 한 번에 가져 오려고하지만 saveToPersistentStoreWithCompletion이 콘솔 내에 여러 번 인쇄되고 시간이 오래 걸립니다. 완전한.MagicalRecord saveToPersistentStoreWithCompletion이 여러 번 발생하여 지연/UI 차단이 많이 발생합니다.

이것은 저장 블록입니다.

[[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 *** 

UPDATE 1 :

사용하여 다음이 꽤 시간을 줄일 수 있다는 사실 난 그냥 발견하지만 여전히 3 번 저장 것으로 보인다. 아무것도 당신이 지정 방법은 mainThread에서 작업을 수행하는 사용하고있는 작업을 저장하기 때문에 당신은 UI-차단 & 보온재를 볼 이유

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

답변

1

, 즉. 당신이 MagicalRecord+Actions.h & 확인할 파일로 돌아갈 경우

, 당신은 즉, backgroundThread에서 작동 다른 방법을 찾을 수 있습니다 :

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

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

이 &은 피할 사용해보십시오 작동으로 블로킹을 차단하는 것은 백그라운드 스레드에서 수행됩니다.

희망이 있습니다.

+0

이 방법을 사용하면 데이터가 저장되지 않습니다. NSLog는 다음과 같이 말합니다 : - [NSManagedObjectContext (MagicalSaves) MR_saveWithOptions : completion :] (0x1d205090) ** 알 수없는 ** 문맥에 변화가 없음 - –

+0

@WillRoberts가 현재이 시점에서 적절한 해결책은 무엇입니까? 이 방법을 사용하고 싶지만 올바른 컨텍스트를 사용하지 않는 것처럼 보입니다. –