ABPeoplePickerNavigationController Замораживание моего приложения
У меня проблемы с ABPeoplePickerNavigationController, генерирующим зомби и замораживающим мое приложение, я пробовал несколько методов для его инициализации, но, так или иначе, случайным образом зависает мое приложение:
if([appDelegate testInternetConnection]){
ABPeoplePickerNavigationController *picker =[[ABPeoplePickerNavigationController alloc] init];
[picker setPeoplePickerDelegate:self];
[self presentViewController:picker animated:YES completion:nil ];
}else{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Internet Connection Error" message:@"This App needs internet in order to work, please make sure you are connected to a valid network" delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil, nil];
dispatch_async(dispatch_get_main_queue(), ^{
// Display/dismiss your alert
[alert show];
});
}
Я не знаю, что я делаю неправильно, но это замораживает мое приложение вне эмулятора или когда устройство не отлаживает. Есть идеи почему?
-Обновить
Вот код, который я использую для сохранения в Core Data
#pragma mark Save data to Core Data Safely
-(void) saveData{
NSPersistentStoreCoordinator *mainThreadContextStoreCoordinator = [appDelegate persistentStoreCoordinator];
dispatch_queue_t request_queue = dispatch_queue_create("com.4Postcards.savingData", NULL);
dispatch_async(request_queue, ^{
// Create a new managed object context
// Set its persistent store coordinator
NSManagedObjectContext *newMoc = [[NSManagedObjectContext alloc] init];
[newMoc setPersistentStoreCoordinator:mainThreadContextStoreCoordinator];
// Register for context save changes notification
NSNotificationCenter *notify = [NSNotificationCenter defaultCenter];
[notify addObserver:self
selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:newMoc];
// Do the work
// Your method here
// Call save on context (this will send a save notification and call the method below)
NSError *error;
BOOL success = [newMoc save:&error];
if (!success)
NSLog(@"%@",error);
// Deal with error
});
}
- (void)mergeChanges:(NSNotification*)notification
{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Data Saved");
});
}
Как я уже сказал, он не зависает при работе с Xcode, но при отключении
1 ответ
Это связано с основными данными. Помните, что каждый раз, когда вы инициируете изменение данных (например, обновление, удаление, добавление объектов). Создайте новый ManagedObjectContext с тем же persistentStoreCoordinator. И добавьте наблюдателя уведомлений Didsave к основным данным. Что в основном происходит, так это то, что данные ядра не являются потокобезопасными. И давайте предположим, что ваш поток 1 запрашивает данные у объекта 1 и в то же время поток 2 добавляет данные в объект 1 и поток 3, удаляя данные из записи 1. Выполнение будет остановлено, так как параллелизм не управляется. Вам нужно изучить эти ссылки, чтобы лучше понять и увидеть пример кода.