草庐IT

ios - executeFetchRequest 挂起,从不返回错误或继续

coder 2024-01-20 原文

我正在使用 AppDelegate 的默认 managedObjectContext,当我在其上执行 executeFetchRequest 时,它永远不会转到下一行或因错误而崩溃。这是在后台线程上进行的,因此 UI 不会卡住,但数据永远不会填充——我的事件指示器永远不会停止,而且我的调试告诉我它永远不会脱离该语句。我遍历了每一行,并将其缩小到 executeFetchRequest 方法。这可能是什么原因造成的?没有保存任何对象,但我认为这与它没有任何关系。到目前为止,已经一个小时了,所以显然出了点问题。最后,这种情况只会发生 40%。

代码如下:

NSSortDescriptor *byTimestamp = [NSSortDescriptorWithKey:@"timestamp" ascending:NO];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Message"];
[fetchRequest setSortDescriptors:@[byTimestamp]];
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSArray *messages = [managedObjectContext executeFetchRequest:fetchRequest error:&error];//hangs on this line!!
if(error != nil)
  NSLog(@"Error: %@", [error localizedDescription]);

这是我的回溯:

* thread #1: tid = 0x1c03, 0x9329d7d2 libsystem_kernel.dylib`mach_msg_trap + 10, stop reason = signal SIGSTOP
    frame #0: 0x9329d7d2 libsystem_kernel.dylib`mach_msg_trap + 10
    frame #1: 0x9329ccb0 libsystem_kernel.dylib`mach_msg + 68
    frame #2: 0x02488a49 CoreFoundation`__CFRunLoopServiceMachPort + 185
    frame #3: 0x0248d84b CoreFoundation`__CFRunLoopRun + 1243
    frame #4: 0x0248cf44 CoreFoundation`CFRunLoopRunSpecific + 276
    frame #5: 0x0248ce1b CoreFoundation`CFRunLoopRunInMode + 123
    frame #6: 0x029637e3 GraphicsServices`GSEventRunModal + 88
    frame #7: 0x02963668 GraphicsServices`GSEventRun + 104
    frame #8: 0x0041165c UIKit`UIApplicationMain + 1211
    frame #9: 0x000027ad qub`main(argc=1, argv=0xbffff418) + 141 at main.m:16

  thread #3: tid = 0x2203, 0x932a09ca libsystem_kernel.dylib`kevent64 + 10
    frame #0: 0x932a09ca libsystem_kernel.dylib`kevent64 + 10
    frame #1: 0x01c8cc2b libdispatch.dylib`_dispatch_mgr_invoke + 863
    frame #2: 0x01c8c8cc libdispatch.dylib`_dispatch_mgr_thread + 61

  thread #4: tid = 0x2303, 0x932a00ee libsystem_kernel.dylib`__workq_kernreturn + 10
    frame #0: 0x932a00ee libsystem_kernel.dylib`__workq_kernreturn + 10
    frame #1: 0x9017904c libsystem_c.dylib`_pthread_workq_return + 45
    frame #2: 0x90178e19 libsystem_c.dylib`_pthread_wqthread + 448

  thread #5: tid = 0x2403, 0x9329d7d2 libsystem_kernel.dylib`mach_msg_trap + 10
    frame #0: 0x9329d7d2 libsystem_kernel.dylib`mach_msg_trap + 10
    frame #1: 0x9329ccb0 libsystem_kernel.dylib`mach_msg + 68
    frame #2: 0x02488a49 CoreFoundation`__CFRunLoopServiceMachPort + 185
    frame #3: 0x0248d8d4 CoreFoundation`__CFRunLoopRun + 1380
    frame #4: 0x0248cf44 CoreFoundation`CFRunLoopRunSpecific + 276
    frame #5: 0x0248ce1b CoreFoundation`CFRunLoopRunInMode + 123
    frame #6: 0x055ad310 WebCore`RunWebThread(void*) + 608
    frame #7: 0x90176557 libsystem_c.dylib`_pthread_start + 344

  thread #8: tid = 0x2703, 0x9329d7d2 libsystem_kernel.dylib`mach_msg_trap + 10
    frame #0: 0x9329d7d2 libsystem_kernel.dylib`mach_msg_trap + 10
    frame #1: 0x9329ccb0 libsystem_kernel.dylib`mach_msg + 68
    frame #2: 0x02488a49 CoreFoundation`__CFRunLoopServiceMachPort + 185
    frame #3: 0x0248d8d4 CoreFoundation`__CFRunLoopRun + 1380
    frame #4: 0x0248cf44 CoreFoundation`CFRunLoopRunSpecific + 276
    frame #5: 0x0248ce1b CoreFoundation`CFRunLoopRunInMode + 123
    frame #6: 0x00ec7c7c Foundation`-[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 298
    frame #7: 0x00ec7b45 Foundation`-[NSRunLoop(NSRunLoop) run] + 82
    frame #8: 0x00085c60 qub`+[AFURLConnectionOperation networkRequestThreadEntryPoint:](self=0x000d2f1c, _cmd=0x000af418, object=0x00000000) + 304 at AFURLConnectionOperation.m:195
    frame #9: 0x00f150d5 Foundation`-[NSThread main] + 76
    frame #10: 0x00f15034 Foundation`__NSThread__main__ + 1304
    frame #11: 0x90176557 libsystem_c.dylib`_pthread_start + 344

  thread #9: tid = 0x2803, 0x9329d7d2 libsystem_kernel.dylib`mach_msg_trap + 10
    frame #0: 0x9329d7d2 libsystem_kernel.dylib`mach_msg_trap + 10
    frame #1: 0x9329ccb0 libsystem_kernel.dylib`mach_msg + 68
    frame #2: 0x02488a49 CoreFoundation`__CFRunLoopServiceMachPort + 185
    frame #3: 0x0248d8d4 CoreFoundation`__CFRunLoopRun + 1380
    frame #4: 0x0248cf44 CoreFoundation`CFRunLoopRunSpecific + 276
    frame #5: 0x0248ce1b CoreFoundation`CFRunLoopRunInMode + 123
    frame #6: 0x00fccebe Foundation`+[NSURLConnection(Loader) _resourceLoadLoop:] + 393
    frame #7: 0x00f150d5 Foundation`-[NSThread main] + 76
    frame #8: 0x00f15034 Foundation`__NSThread__main__ + 1304
    frame #9: 0x90176557 libsystem_c.dylib`_pthread_start + 344

  thread #10: tid = 0x2903, 0x9329fbe6 libsystem_kernel.dylib`select$DARWIN_EXTSN + 10
    frame #0: 0x9329fbe6 libsystem_kernel.dylib`select$DARWIN_EXTSN + 10
    frame #1: 0x024cacb7 CoreFoundation`__CFSocketManager + 1255
    frame #2: 0x90176557 libsystem_c.dylib`_pthread_start + 344

  thread #11: tid = 0x2a03, 0x9329f91a libsystem_kernel.dylib`__psynch_mutexwait + 10
    frame #0: 0x9329f91a libsystem_kernel.dylib`__psynch_mutexwait + 10
    frame #1: 0x9017c13b libsystem_c.dylib`pthread_mutex_lock + 595
    frame #2: 0x014cdb01 CoreData`-[_PFLock lock] + 33
    frame #3: 0x014cdada CoreData`-[NSPersistentStoreCoordinator lock] + 42
    frame #4: 0x014e257e CoreData`-[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 1182
    frame #5: 0x014e09c9 CoreData`-[NSManagedObjectContext executeFetchRequest:error:] + 569
    frame #6: 0x000492fe qub`__36-[RIPConvosViewController pullData:]_block_invoke(.block_descriptor=0x118e9320, newMessages=0x00000000, oldMessages=0x00000000) + 638 at RIPConvosViewController.m:73
    frame #7: 0x00048fb4 qub`-[RIPConvosViewController pullData:](self=0x075293d0, _cmd=0x000abda7, completion=0xb0375ef0) + 212 at RIPConvosViewController.m:103
    frame #8: 0x0004bab8 qub`__40-[RIPConvosViewController refreshTable:]_block_invoke(.block_descriptor=0x118d2e50) + 168 at RIPConvosViewController.m:236
    frame #9: 0x01c8753f libdispatch.dylib`_dispatch_call_block_and_release + 15
    frame #10: 0x01c99014 libdispatch.dylib`_dispatch_client_callout + 14
    frame #11: 0x01c8a2e8 libdispatch.dylib`_dispatch_root_queue_drain + 335
    frame #12: 0x01c8a450 libdispatch.dylib`_dispatch_worker_thread2 + 39
    frame #13: 0x90178e12 libsystem_c.dylib`_pthread_wqthread + 441

顺便说一句,这段代码位于 RIPConvosViewController 类的 pullData 方法中一个名为 fetchBlock 的 block 中。

我相信这是一个线程问题,但我不知道如何解决这个问题——我是否应该确保我对 Core Data 的所有调用都在同一个线程上?如果这是解决方案,我该怎么做?

最佳答案

我有同样的问题并检查了这个线程:executeFetchRequest:error: freezes app

我通过将 NSManagedObjectContext 请求放在 @synchronized block 中解决了这个问题。

我的代码是:

-(void)saveBookmarksToCache:(NSMutableArray *) bookmarkList error:(NSError **)error
{

    NSFetchRequest *allBookmarks = [[NSFetchRequest alloc] init];
    [allBookmarks setEntity:self.bookmarkDescription];
    [allBookmarks setIncludesPropertyValues:NO]; // Just fetch the Id

    __autoreleasing NSError *reqError = nil;
    NSArray *bookmarks = [self.managedObjectContext executeFetchRequest:allBookmarks error:&reqError];


    if (reqError != nil)
        error = &reqError;
    ...

    // Save
    [self.managedObjectContext save:&reqError];
    ...
}

它一直卡在 executeFetchRequest 行上(我有几个类在或多或少的同一时间执行相同类型的过程)。

按照另一个线程中的建议,我将其转换为:

-(void)saveBookmarksToCache:(NSMutableArray *) bookmarkList error:(NSError **)error
{

    NSFetchRequest *allBookmarks = [[NSFetchRequest alloc] init];
    [allBookmarks setEntity:self.bookmarkDescription];
    [allBookmarks setIncludesPropertyValues:NO]; // Just fetch the Id

    __autoreleasing NSError *reqError = nil;
    // Lock the PersistenStoreCoordinator for the whole process
    @synchronized(self.persistentStoreCoordinator) {
        NSArray *bookmarks = [self.managedObjectContext executeFetchRequest:allBookmarks error:&reqError];

        if (reqError != nil)
            error = &reqError;
        ...

        // Save
        [self.managedObjectContext save:&reqError];
        ...

    }
}

这似乎已经解决了我的问题。

关于ios - executeFetchRequest 挂起,从不返回错误或继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18544278/

有关ios - executeFetchRequest 挂起,从不返回错误或继续的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  3. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  4. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  5. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  6. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  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-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

  9. 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

  10. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

随机推荐