코어 데이터 저장 및 멀티 스레드 지원을 위해 Magical Record를 사용하고 있습니다.코어 데이터를 매직 레코드로 저장
GCD로 새 스레드를 시작합니다. 이 새 스레드에서 엔티티가 존재하는지 확인합니다. 그렇지 않다면 새로운 것을 만들고 그것을 저장하고 싶습니다.
saveUsingCurrentThreadContextWithBlock^(NSManagedObjectContext *localContext){}
주 스레드가 아닌 스레드에서 호출되는 경우 주 스레드로 돌아가서 저장합니까?
또는 새 스레드에 컨텍스트를 전달해야합니까?
편집 : '
MBProgressHUD *HUD = [MBProgressHUD showHUDAddedTo:self.mapView animated:YES];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
Person *person = [Person MR_findFirstByAttribute:NAME withValue:self.user.username];
if (person == NULL) {
NSLog(@"SEPERATE THREAD | person %@ does not exist, creating", self.user.username);
person = [Person MR_createEntity];
person.name = self.user.username;
person.uid = self.user.UID;
[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveOnlySelfWithCompletion:^(BOOL success, NSError *error) {
[MBProgressHUD hideHUDForView:self.mapView animated:YES];
Person *person = [Person MR_findFirstByAttribute:NAME withValue:self.user.username];
if (person) {
NSLog(@"COMPLETION BLOCK | person exists: %@", person.name);
}
}];
}
else {
NSLog(@"SEPERATE THREAD | person %@ does", self.user.username);
dispatch_async(dispatch_get_main_queue(), ^{
[MBProgressHUD hideHUDForView:self.mapView animated:YES];
});
}
});
이 (절약이 방법은 지속성 아니라, 내가 응용 프로그램을 다시 시작하고 내가 할 수있는 : 주 스레드에서
, 나는 MBProgress 표시기를 만들고 새 스레드를 생성 Person 엔티티를 찾으십시오) :
2013-03-12 14:25:44.014 SEPERATE THREAD | person iDealer does not exist, creating
2013-03-12 14:25:44.014 SEPERATE THREAD | thread: <NSThread: 0x84ca720>{name = (null), num = 4}
2013-03-12 14:25:44.015 -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x840ec30) → Saving <NSManagedObjectContext (0x840ec30): *** UNNAMED ***> on *** BACKGROUND THREAD ***
2013-03-12 14:25:44.015 -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x840ec30) → Save Parents? 0
2013-03-12 14:25:44.015 -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x840ec30) → Save Synchronously? 0
2013-03-12 14:25:44.016 -[NSManagedObjectContext(MagicalRecord) MR_contextWillSave:](0x840ec30) Context UNNAMED is about to save. Obtaining permanent IDs for new 1 inserted objects
2013-03-12 14:25:44.132 __70-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:]_block_invoke21(0x840ec30) → Finished saving: <NSManagedObjectContext (0x840ec30): *** UNNAMED ***> on *** BACKGROUND THREAD ***
2013-03-12 14:25:44.134 COMPLETION BLOCK | thread: <NSThread: 0x8435f30>{name = (null), num = 1}
2013-03-12 14:25:44.134 COMPLETION BLOCK | person exists: iDealer
'saveUsingCurrentThreadContextWithBlock'내부의 코드가 백그라운드 스레드에서 실행되고 있습니다 (MR 문서 당) - 여기에 GCD를 정확히 사용하는 이유는 무엇입니까? – Petar