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. Выполнение будет остановлено, так как параллелизм не управляется. Вам нужно изучить эти ссылки, чтобы лучше понять и увидеть пример кода.

Параллелизм разработчика Apple с основными данными

Образец кода Apple Developer

StackoverFlow Detail

Блог с примерами кода

Другие вопросы по тегам