ABPeoplePickerNavigationController 冻结我的应用程序

Posted

技术标签:

【中文标题】ABPeoplePickerNavigationController 冻结我的应用程序【英文标题】:ABPeoplePickerNavigationController Freezing my app 【发布时间】:2014-09-22 22:03:37 【问题描述】:

我在 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 运行时它不会冻结,但断开连接时会冻结

【问题讨论】:

您在应用程序中使用 coredata 吗?? 为什么需要互联网来选择联系人? 您是否尝试过使用调试器查看您的应用“冻结”的位置? @Saad 是的,我正在使用 coredata。 在导航到此屏幕时,您正在执行 coredata 任务? 【参考方案1】:

这是由于核心数据。请记住,每次您对数据进行更改(例如更新、删除、添加对象)时。使用相同的 persistentStoreCoordinator 创建一个新的 ManagedObjectContext。并将 Didsave 通知观察者添加到核心数据中。基本上发生的是核心数据不是线程安全的。假设您的线程 1 要求来自实体 1 的数据,同时线程 2 向实体 1 添加数据,线程 3 从条目 1 中删除数据。由于未管理并发,因此将停止执行。对您来说,研究这些链接以更好地理解并查看示例代码。

Apple Developer Concurrency with Core Data

Sample Code Apple Developer

*** Detail

A blog with code examples

【讨论】:

嗨!很好的反应,但仍然是同样的问题,我改变了在 Core Data 中保存数据的方式,现在它仅在未连接到 Xcode 时冻结在同一点。 在后台线程中尝试 mergeChanges,您是否更改了所有更新请求代码?还是仅在调用此方法时? 全部更改,我什至可以在不需要通知时删除通知,但最后错误总是在 ABPeoplePickerNavigationController *picker =[[ABPeoplePickerNavigationController alloc] init];

以上是关于ABPeoplePickerNavigationController 冻结我的应用程序的主要内容,如果未能解决你的问题,请参考以下文章