草庐IT

iphone - 合并 CoreData 托管上下文时出现异常/崩溃

coder 2024-01-13 原文

我在尝试将托管上下文(在后台线程上运行)与我的主托管上下文(在主线程上)合并时遇到以下异常。我似乎无法在我自己的@try 表达式中捕捉到异常。有没有人对这个问题有任何见解?

我正在使用默认的合并策略,但我不确定这是正确的 - 这个问题是间歇性的 - 很少发生但会导致我的应用程序崩溃。

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread:  0

Last Exception Backtrace:
0   CoreFoundation                  0x37e3b8bf __exceptionPreprocess + 163
1   libobjc.A.dylib                 0x319211e5 objc_exception_throw + 33
2   CoreData                        0x344b7ea5 -[NSSQLiteStatement cachedSQLiteStatement] + 1
3   CoreData                        0x344b774f -[NSSQLiteConnection prepareSQLStatement:] + 55
4   CoreData                        0x3455b049 -[NSSQLChannel selectRowsWithCachedStatement:] +  61
5   CoreData                        0x34586d63 newFetchedRowsForFetchPlan_MT + 783
6   CoreData                        0x344bfb07 -[NSSQLCore newRowsForFetchPlan:] + 351
7   CoreData                        0x34565011 -[NSSQLCore fetchRowForObjectID:] + 1005
8   CoreData                        0x344d1a57 -[NSSQLCore newValuesForObjectWithID:withContext:error:] + 195
9   CoreData                        0x344d0f83 _PFFaultHandlerLookupRow + 423
10  CoreData                        0x3450e111 -[NSFaultHandler fulfillFault:withContext:] + 25
11  CoreData                        0x34518999 -[NSManagedObject(_NSInternalMethods) _newPropertiesForRetainedTypes:andCopiedTypes:preserveFaults:] + 77
12  CoreData                        0x345178ef -[NSManagedObject(_NSInternalMethods) _newAllPropertiesWithRelationshipFaultsIntact__] + 79
13  CoreData                        0x345284db -[NSManagedObjectContext(_NSInternalChangeProcessing) _establishEventSnapshotsForObject:] + 47
14  CoreData                        0x3452694b -[NSManagedObjectContext deleteObject:] + 155
15  CoreData                        0x345238a1 -[NSManagedObjectContext _mergeChangesFromDidSaveDictionary:usingObjectIDs:] + 813
16  CoreData                        0x34522c35 -[NSManagedObjectContext mergeChangesFromContextDidSaveNotification:] + 189
17  myapp                       0x0008f0e9 0x8d000 + 8425
18  CoreFoundation                  0x37d9a22b -[NSObject performSelector:withObject:] + 43
19  Foundation                      0x31d75757 __NSThreadPerformPerform + 351
20  CoreFoundation                  0x37e0fb03 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
21  CoreFoundation                  0x37e0f2cf __CFRunLoopDoSources0 + 215
22  CoreFoundation                  0x37e0e075 __CFRunLoopRun + 653
23  CoreFoundation                  0x37d914dd CFRunLoopRunSpecific + 301
24  CoreFoundation                  0x37d913a5 CFRunLoopRunInMode + 105
25  GraphicsServices                0x3790ffcd GSEventRunModal + 157
26  UIKit                           0x35221743 UIApplicationMain + 1091

我在 nsoperation 的 start() 中初始化背景上下文,如下所示:

AppDelegate *appController = [[UIApplication sharedApplication] delegate];
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[appController setPersistentStore:_managedObjectContext];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedDeletedObjects:) name:NSManagedObjectContextDidSaveNotification object:_managedObjectContext];

我还设置了一个通知事件,当在后台管理的上下文中删除对象时调用该事件,然后回调执行:

-(void)receivedDeletedObjects:(NSNotification *)note
{
    AppDelegate *appController = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *mainContext = [self managedObjectContext];
[mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) withObject:note waitUntilDone:NO];

}

这就是代码。我有 4 个不同的后台线程,每个线程都有自己的托管上下文,以这种方式与主上下文合并做同样的事情。我想知道多个线程同时进入 mergeChangesFromContextDidSaveNotification 但不应该是这种情况,因为它总是在主线程上调用。

最佳答案

这个怎么样:

(全部在 AppDelegate 中,从后台线程调用 freshContextForBackgroundTask 并使用 save: 触发合并。)注意 syncObj 是一个普通的 NSObject 实例,当使用许多后台线程时(或者只是运气不好)调度)

-(NSManagedObjectContext*) freshContextForBackgroundTask {
    @synchronized(syncObj) {
        NSManagedObjectContext* r = [[NSManagedObjectContext alloc] init];
        [r setPersistentStoreCoordinator:self.managedObjectContext.persistentStoreCoordinator];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(backgroundContextDidSave:)
                                                     name:NSManagedObjectContextDidSaveNotification
                                                   object:r];
        return r;
    }
}


- (void)backgroundContextDidSave:(NSNotification *)notification {
    /* Make sure we're on the main thread when updating the main context */
    //NSLog(@"merging change: %@",notification);
    dispatch_async(dispatch_get_main_queue(), ^{
        NSManagedObjectContext *context = [self managedObjectContext];
        // this for loop may not be needed for your purpose.
        for(NSManagedObject *object in [[notification userInfo] objectForKey:NSUpdatedObjectsKey]) {
            [[context objectWithID:[object objectID]] willAccessValueForKey:nil];
        }
        [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];

    });
}

你的方法看起来很奇怪。尤其是当您将应用委托(delegate)的持久存储设置为 (nil) 新初始化的上下文之一时。

关于iphone - 合并 CoreData 托管上下文时出现异常/崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9234548/

有关iphone - 合并 CoreData 托管上下文时出现异常/崩溃的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  3. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  4. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  5. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  6. ruby-on-rails - Rails - 乐观锁定总是触发 StaleObjectError 异常 - 2

    我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd

  7. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  8. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  9. ruby - 在 Ruby 中重新分配常量时抛出异常? - 2

    我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案

  10. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

随机推荐