jjzjj

ios - Magical Record 后台保存似乎阻塞了 UI

coder 2023-09-24 原文

我有一个放在队列中的 NSOperation。 NSOperation 做了一些长时间运行的照片处理,然后我将信息/元数据保存在该照片的核心数据中。在我的自定义 NSOperation 类的主要方法中,我执行以下代码块

-(void)main
{
    //CODE ABOVE HANDLES PHOTO PROCESSING...
    //........

    //THEN I SAVE ALL DATA BELOW LIKE SO
    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {

        Post *post = [Post createInContext:localContext];

        //set about 15 pieces of data, all strings and floats
        post.XXXX = XXXXX;
        post.DDDD = DDDDD;
        etc...
    } completion:^(BOOL success, NSError *error) {
        NSLog(@"Done saving");
    }];
}

我的问题是,即使保存时只有 3 张照片,它也会卡住我的 UI。我本以为在 NSOperation 中执行这个我会没事的。

我应该补充一点,每个 NSOperation 处理一张照片,所以有时队列可能有 5-10 张照片,但我认为这不会有任何区别,即使只有三张照片,就像我说的那样会卡住 UI。

谢谢你的帮助。

更新:------------*------------

我切换到 2.2 版,但这似乎更阻碍了 UI...现在我正在使用

-(void)main
{
    NSManagedObjectContext *localContext = [NSManagedObjectContext    contextForCurrentThread];
    //CODE BELOW HANDLES PHOTO PROCESSING...
    //........

    //THEN I SAVE ALL DATA BELOW LIKE SO
    Post *post = [Post createInContext:localContext];

    //set about 15 pieces of data, all strings and floats
    post.XXXX = XXXXX;
    post.DDDD = DDDDD;


    [localContext saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) {

    }];
}

这一切都是在我的 NSOperation 类中完成的,我做错了什么吗?

最佳答案

不要将 saveWithBlock 调用放在后台线程中。您实际上是在从后台线程创建后台线程,在这种情况下,这只会减慢您的速度。你应该只能调用 saveWithBlock 并且它应该将你所有的保存代码放在后台。但是,我还注意到您在代码的主 UI 页面中进行了所有更改,然后才调用保存。这是这种方法的错误用法。你想做更像这样的事情:

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
    Post *post = [Post createInContext:localContext];

    //photo processing
    //update post from photo processing
} completion:^(BOOL success, NSError *error) {
   //This is called when data is in the store, and is called on the main thread
}];

如果您确实需要 NSOperation,我建议使用不同的模式:

- (void) main {
   NSManagedObjectContext *localContext = [NSManagedObjectContext confinementContext];
  // Do your photo stuff here

  Post *post = [Post createInContext:localContext];
  //more stuff to update post object

  [localContext saveToPersistentStoreAndWait];

}

关于ios - Magical Record 后台保存似乎阻塞了 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17304616/

有关ios - Magical Record 后台保存似乎阻塞了 UI的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  3. 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返回它复制的字节数,但是当我还没有下

  4. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  5. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

  6. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  7. ruby-on-rails - 在 heroku 的 .fonts 文件夹中包含自定义字体,似乎无法识别它们 - 2

    Heroku支持人员告诉我,为了在我的Web应用程序中使用自定义字体(未安装在系统中,您可以在bash控制台中使用fc-list查看已安装的字体)我必须部署一个包含所有字体的.fonts文件夹里面的字体。问题是我不知道该怎么做。我的意思是,我不知道文件名是否必须遵循heroku的任何特殊模式,或者我必须在我的代码中做一些事情来考虑这种字体,或者如果我将它包含在文件夹中它是自动的......事实是,我尝试以不同的方式更改字体的文件名,但根本没有使用该字体。为了提供更多详细信息,我们使用字体的过程是将PDF转换为图像,更具体地说,使用rghostgem。并且最终图像根本不使用自定义字体。在

  8. ruby - 如何在 ruby​​ 中运行后台线程? - 2

    我是ruby​​的新手,我认为重新构建一个我用C#编写的简单聊天程序是个好主意。我正在使用Ruby2.0.0MRI(Matz的Ruby实现)。问题是我想在服务器运行时为简单的服务器命令提供I/O。这是从示例中获取的服务器。我添加了使用gets()获取输入的命令方法。我希望此方法在后台作为线程运行,但该线程正在阻塞另一个线程。require'socket'#Getsocketsfromstdlibserver=TCPServer.open(2000)#Sockettolistenonport2000defcommandsx=1whilex==1exitProgram=gets.chomp

  9. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  10. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

随机推荐