iOS 5 核心数据冻结

2024-05-26

我尝试做以下简单的事情:

NSArray * entities = [context executeFetchRequest:inFetchRequest error:&fetchError];

没有什么花哨。但这在 iOS 5 中冻结,在 iOS 4 中工作正常。我没有收到异常、警告或错误;我的应用程序只是冻结了。

请帮帮我!我快死在这里了! ;)


我不知道你是否也使用不同的线程。如果是,则问题来自 NSManagedObjects 本身不是线程安全的事实。在主线程上创建 ManagedContext 并在另一个线程上使用它会冻结该线程。

也许这篇文章可以帮助你:http://www.cimgf.com/2011/05/04/core-data-and-threads-without-the-headache/ http://www.cimgf.com/2011/05/04/core-data-and-threads-without-the-headache/

Apple 有一个演示应用程序,用于在多个线程(通常是主线程和后台线程)上处理 Coredata:http://developer.apple.com/library/ios/#samplecode/TopSongs/Introduction/Intro.html http://developer.apple.com/library/ios/#samplecode/TopSongs/Introduction/Intro.html

我为解决这个问题所做的是:

  • 在应用程序委托中:创建持久存储(一个用于所有线程)并为主线程创建 Coredata 托管上下文,
  • 在后台线程中,创建一个新的托管上下文(来自同一个持久存储)
  • 保存时使用通知,让 mainContext 知道后台线程何时完成(插入行或其他)。

有几种解决方案,使用 NSQueueOperation。就我而言,我正在使用 while 循环。这是我的代码,如果它可以帮助你。然而,Apple 关于并发性的文档及其热门歌曲示例应用程序是很好的起点。

在应用程序委托中:

 -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    self.cdw = [[CoreDataWrapper alloc] initWithPersistentStoreCoordinator:[self persistentStoreCoordinator] andDelegate:self];
    remoteSync = [RemoteSync sharedInstance];

    ...

    [self.window addSubview:navCtrl.view];
    [viewController release];

    [self.window makeKeyAndVisible];
    return YES; 
}    

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    if (persistentStoreCoordinator == nil) {
        NSURL *storeUrl = [NSURL fileURLWithPath:self.persistentStorePath];
        NSLog(@"Core Data store path = \"%@\"", [storeUrl path]);
        persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[NSManagedObjectModel mergedModelFromBundles:nil]];
        NSError *error = nil;
        NSPersistentStore *persistentStore = [persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error];
        NSAssert3(persistentStore != nil, @"Unhandled error adding persistent store in %s at line %d: %@", __FUNCTION__, __LINE__, [error localizedDescription]);
    }
    return persistentStoreCoordinator;
}


-(NSManagedObjectContext *)managedObjectContext {
    if (managedObjectContext == nil) {
        managedObjectContext = [[NSManagedObjectContext alloc] init];
        [managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
    }
    return managedObjectContext;
}

-(NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    if (persistentStoreCoordinator == nil) {
        NSURL *storeUrl = [NSURL fileURLWithPath:self.persistentStorePath];
        NSLog(@"Core Data store path = \"%@\"", [storeUrl path]);
        persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[NSManagedObjectModel mergedModelFromBundles:nil]];
        NSError *error = nil;
        NSPersistentStore *persistentStore = [persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error];
        NSAssert3(persistentStore != nil, @"Unhandled error adding persistent store in %s at line %d: %@", __FUNCTION__, __LINE__, [error localizedDescription]);
    }
    return persistentStoreCoordinator;
}


-(NSManagedObjectContext *)managedObjectContext {
    if (managedObjectContext == nil) {
        managedObjectContext = [[NSManagedObjectContext alloc] init];
        [managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
    }
    return managedObjectContext;
}


-(NSString *)persistentStorePath {
    if (persistentStorePath == nil) {
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths lastObject];
        persistentStorePath = [[documentsDirectory stringByAppendingPathComponent:@"mgobase.sqlite"] retain];
    }
    return persistentStorePath;
}

-(void)importerDidSave:(NSNotification *)saveNotification {
    if ([NSThread isMainThread]) {
        [self.managedObjectContext mergeChangesFromContextDidSaveNotification:saveNotification];
    } else {
        [self performSelectorOnMainThread:@selector(importerDidSave:) withObject:saveNotification waitUntilDone:NO];
    }
}

在运行后台线程的对象中:

monitor = [[NSThread  alloc] initWithTarget:self selector:@selector(keepMonitoring) object:nil];

-(void)keepMonitoring{
    while(![[NSThread currentThread]  isCancelled]) {
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];    
        AppDelegate * appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

        //creating the cdw here will create also a new managedContext on this particular thread
        cdwBackground = [[CoreDataWrapper alloc] initWithPersistentStoreCoordinator:appDelegate.persistentStoreCoordinator andDelegate:appDelegate];
        ...
    }
}

希望这有帮助,

M.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 5 核心数据冻结 的相关文章

  • 如何在 iBooks 上搜索桌面 UI

    我想像 iBooks 中那样显示 tableview 的搜索栏 我如何减少搜索栏的宽度以及如何在没有任何背景颜色的情况下显示它 另外 当页面显示时 如何最初隐藏搜索框 我可以想到两个选择 通过子类化 UITextfield 创建您自己的 U
  • 在 iOS 模拟器主屏幕或锁屏中设置壁纸(背景图像)

    当我正在绞尽脑汁思考某件事时 我的脑海中突然出现了这个想法 我们可以将模拟器的主屏幕背景图像设置为我们选择的图像吗 Xcode 3 2 2 模拟器 3 1 3 就是一个很好的例子 Certain versions of the simula
  • iPhone iOS 保存从 UIImageJPEGRepresentation() 获得的数据第二次失败:ImageIO: CGImageRead_mapData 'open' failed

    我的 UIImage 操作遇到了一个奇怪的问题 我正在进行保管箱同步 并且必须将我的图像存储为本地文件 为此 我使用以下命令保存它们UIImagePNGRepresentation image or UIImageJPEGRepresent
  • 如何在 iOS 中查找蓝牙音频设备

    好的 我正在开发一个有趣的项目 该项目有一个障碍 我需要为我的 iOS 应用程序启用蓝牙音频支持 我遇到的障碍是我什至无法开始获取已连接的蓝牙音频设备的列表 即使我的 iPhone 5S 可以识别我的耳机 大约 3 4 岁的耳机 LG HB
  • 滑动删除不起作用

    滑动删除功能在我的表格视图中不起作用 我已经在导航栏中实现了 commitEditingStyle 委托和编辑按钮 因此 当用户单击编辑按钮时 删除和添加按钮会相应显示 但是 在滑动时 删除按钮不会出现 并且似乎它无法将滑动识别为对 set
  • UITableview 中的水平和垂直滚动[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 I want to make a lineup for a festival You can see what I want to a
  • iphone - 自动释放,没有池 - 只是泄漏

    我的主代码中有这一行 self performSelectorInBackground selector animateMe withObject nil 这是 animateMe void animateMe UIView animate
  • iPad 照片选择器崩溃

    我正在使用以下函数根据 UIActionSheet 的结果激活设备相机或图像选择器 如果 fromCamera YES 那么它适用于 iPhone 和 iPad 如果 fromCamera NO 那么它可以在 iPhone 上运行并出现图像
  • 如何替换已弃用的方法dispatch_get_current_queue()? [复制]

    这个问题在这里已经有答案了 我正在 iOS 5 中使用 xmppframework 开发一个聊天应用程序 它工作得很好 但我将 Xcode 更新到 4 5 1 将 iOS 5 更新到 iOS 6 将 Mac OS 更新到 10 7 5 但由
  • 网站在 iPhone 屏幕右侧显示空白区域

    我遇到问题http eiglaw com http eiglaw com iPhone 屏幕右侧显示约 25 像素宽的空白 边框 我在 stackoverflow 上研究了这个问题 这些帖子是相关的 但是当我尝试提供的各种解决方案时 我无法
  • 如何知道我的应用程序使用了多少 iCloud 空间?

    有没有办法查看我的应用程序正在备份到 iCloud 的内容以及它消耗了多少内存 Settings gt iCloud gt Storage Backup gt Manage Storage将显示正在备份的总计内容 iOS 会备份位于应用程序
  • 持久化 UINavigationItem 的 rightBarButtonItem 属性

    这可能是一个愚蠢的问题 但是有可能保持正确的吗 UIBarButtonItem跨由一个管理的多个视图UINavigationController 我的一系列观点通常具有相同的权利UIBarButtonItem 但是当我将新视图推送到我的UI
  • 如何将 UILabel 的值绑定到实例变量?

    我是 mac objective c 的新手 我的问题是 我想知道是否可以将 UILabel 文本绑定到变量 而不必在值更改时手动设置文本 例如 在 Mac OS 上 当我打开新的 Finder 窗口并删除文件时 任务栏中的全局可用空间就会
  • 减少 CoreData 的调试输出?

    我正在开发一个使用 CoreData 的 iOS macOS 项目 它工作正常 但它会向控制台输出大量调试信息 这使得控制台无法使用 因为我的打印语句隐藏在所有与 CoreData 相关的内容中 我有一个非常简单的 CoreData 设置
  • 在 iPhone 中缝合图片

    我想并排缝合2张png 在Cocoa中 我会使用 NSImage initWithSize 然后只是drawInRect 但是 UIImage 没有 initWithSize 类 我现在该怎么做 Use UIGraphicsBeginIma
  • UIImageJPEGRepresentation 在视网膜显示屏上提供 2x 图像

    我有这段代码 它创建一个图像 然后向其添加一些效果并缩小其大小以使其largeThumbnail UIImage originalImage UIImage imageWithData self originalImage thumbnai
  • 如何检测用户是否第一次打开应用程序[重复]

    这个问题在这里已经有答案了 是否可以检测用户是否是第一次打开iOS应用程序 使用Objective C 我想在用户第一次打开应用程序时显示欢迎消息 但之后不再向他们显示 我正在寻找类似的东西 BOOL firstTime AppDelega
  • 有没有类似于 iOS 的 canOpenURL 来检查移动浏览器的 URL 方案? [复制]

    这个问题在这里已经有答案了 可能的重复 iPhone Safari 检查 JavaScript 是否支持 URL 方案 https stackoverflow com questions 627916 iphone safari check
  • iPhone X 将对象底部与安全区域对齐会破坏其他设备上的外观

    关于 iPhone X 自动布局怪癖的问题 我有两个按钮 以前这些按钮将与超级视图底部对齐 偏移量为 20 以免它们接触屏幕底部 此后我将链接更改为安全区域而不是超级视图 Here s the original setup Looks go
  • iphone sqlite 静态链接?

    有人静态链接 sqlite 而不是使用动态链接 吗 我遇到的问题是 越狱手机的用户没有与普通 iPhone 所采用的 sqlite 版本相同的版本 因此导致崩溃 我假设在我的应用程序中静态链接已知版本的 sqlite 就是答案 我需要全文支

随机推荐

  • 在设置/重置位方面,“分支”意味着什么?

    在一次采访中 我被问到 你如何设置或重置一点 这是一个很简单的问题 我也回答了 之后 他们问我如何做同样的事情 但不分支 我不知道什么是分支 我搜索并发现位摆弄黑客 http graphics stanford edu 7Eseander
  • Visual Studio 2010:如何重新映射 F2 来重命名文件而不是打开对象浏览器

    In Visual Studio 2010 Solution Explorer tree view how can I remap the F2 key to Rename the Selected File rather than ope
  • 为什么这个 chrome.browserAction.setIcon 方法不起作用?

    我正在查看文档页面 https developer chrome com extensions browserAction method setIcon我不知道我的代码有什么问题 chrome browserAction setIcon d
  • j2me中读取文件内容

    我有一个如下所示的文件 OrderNo id name count Format 1 AA1 sdflsdfsdfd 12 01 2 AB2 asdaewqrftr 13 02 3 AA3 aerefytrsu 12 01 我想读取这个文件
  • 如何递归地将嵌套对象数组转换为平面对象数组?

    我有以下深度嵌套对象数组 const data name foo children count 1 name A count 2 name B name bar children count 3 name C children count
  • 如何仅将 dist 文件夹部署到 azure 网站?

    我的 azure 网站项目中有 src 文件和 dist 文件夹 project src dist 默认行为上传项目内的所有文件 即 src 和 dist website src dist 我想保持网站干净 只包含 dist 文件 webs
  • 使用后退/前进按钮时,将页面重定向到自定义页面,而不是默认显示“网页已过期”

    我正忙于一个只有一个页面的网站 只有登录后才能访问 home jsp 一旦用户使用有效会话登录 如果他按下浏览器上的后退按钮 那么他应该被重定向到login jsp如果他按下浏览器的前进按钮 则会再次出现 他应该无法到达home jsp所以
  • 具有自定义值类型的 map::emplace()

    我使用时遇到问题map emplace 谁能帮我找出正确的语法来使用 我实际上正在尝试做同样的事情这个例子 http www cplusplus com reference map map emplace 这是我的版本 include
  • 视图不在窗口层次结构中的 iOS

    当我从 PassCode 控制器移动到 OTP ViewController 时 我在控制台中收到以下错误 警告 尝试在 PassCodeController 0x1ec3e000 gt 其视图不在窗口层次结构中 这是我用来在视图之间更改的
  • 忽略 Racket 中的多个返回值

    在 Racket 中 可以通过执行以下操作从函数返回多个值 define foo values 1 2 3 然后我们可以通过这样做来绑定它们 define values one two three foo Now one一定会1 two t
  • 将多个绘图合并为 gif

    我正在尝试使用 caTools 包将多个绘图组合成一个 gif 我的基本代码如下所示 for i in 1 100 plot plots few points and lines changes slightly with each i 我
  • android 中的自定义 MediaPlayer 类

    我刚刚完成了一个项目 我使用网络视图进行视频播放 现在我被要求用自定义播放器替换 webview 部分 玩家应该能够处理 HLS 如果我使用VideoView和MediaController 我可以播放直播 但不幸的是 MediaContr
  • 选择列的一部分

    我想知道是否有人可以帮助查询以选择列的一部分 criteriadata 列包含如下所示的数据 标准数据 14 27 15 14 30 15 DD 14 38 15 通过 14 33 15 通过 如何只选择数字 15 之后出现的数据 非常感谢
  • AVAudioPlayer 在 iPhone 5 中无法工作

    我正在开发一个 iPhone 应用程序 在这个应用程序中 我使用 AVAudioPlayer 来播放音频 这是我播放声音的代码 NSString resourcePath NSBundle mainBundle resourcePath r
  • 如何为 VueJS 组件创建 v-model 修饰符?

    在VueJS中有一些v model修改预解析绑定值 例如v model trim从字符串中删除空格 如何创建自己的修改器 例如v model myparse今天嗯使用类似的东西 computed name get function retu
  • 避免在 Flutter Web 插件包之外使用纯 Web 库

    我正在构建一个 Flutter 应用程序 并尝试在网络上运行 其中一部分包含一些特定于网络的代码 import dart html as html import package flutter foundation dart class D
  • to_proc 方法在 Ruby 中意味着什么?

    我正在学习 Rails 并关注这个线程 https stackoverflow com questions 1961030 我被困住了to proc方法 我认为符号只是字符串的替代品 它们就像字符串 但在内存方面更便宜 如果我还缺少任何其他
  • 在 Cordova 中单击 html 按钮时启动新活动

    我正在尝试使用 Cordova 和 Java 构建 Android 应用程序 我想构建当在 HTML 代码中单击按钮时启动新 Intent 的意图 这是我的 HTML 代码 h2 Hello Android h2
  • Aptana Python stdlib 与 virtualenv 的问题

    我最近开始开发一个项目 仅使用 vim 作为我的文本编辑器和 virtualenv 设置 我从 GitHub 在此 virtualenv 上安装了一些 API 最终 项目变得有点大了 超出了 vim 的处理能力 所以我不得不将项目移动到 I
  • iOS 5 核心数据冻结

    我尝试做以下简单的事情 NSArray entities context executeFetchRequest inFetchRequest error fetchError 没有什么花哨 但这在 iOS 5 中冻结 在 iOS 4 中工