jjzjj

ios - for 循环中的异步任务

coder 2024-01-19 原文

我希望它们按如下方式执行三种方法:

+(void)method1{
    // Some code
    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        for (int i=0; i<count; i++) {
            //getting object(x) from json
            [self method2:x];//trigger method2
        }
    });
}

+(void)method2:(NSString*)x{
// Some code
    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        for (int i=0; i<count; i++) {
            //getting objects(y,z) from json
            //SAVE that object in SQLite database
            [self method3:y:z];//trigger method3
        }
    });
}

+(void)method3:(NSString*)y :(NSString*)z{
// Some code
    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        for (int i=0; i<count; i++) {
            //getting object from json
            //SAVE that object in SQLite database
        }
    });
}

我所拥有的始终是数据库中的随机数据,而且并非所有数据都已存储。 我的问题是如何组织这些异步任务以在数据库中获取正确的数据。 非常感谢您的帮助。

编辑:

+(void)getData:(NSString*)artist{

    LKDBHelper* globalHelper = [LKDBHelper getUsingLKDBHelper];

    NSMutableArray *arrayOfSongs=[[NSMutableArray alloc]init];
    artist = [artist stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    //DLog(@"artisttt %@",artist);

    NSString *url=[NSString stringWithFormat:@"%@?artist=%@", @"http://localhost/kalimat/get_kalimat.php",artist];

    url = [url stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet];

    //NSLog(@"url %@",url);

    NSURL *urlChannels= [ NSURL URLWithString:url];


    NSURLRequest *request = [NSURLRequest requestWithURL:urlChannels];

    [LKDBHelper clearTableData:[Song class]];

    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSMutableArray *arrayOfJson=JSON;


            for (int i=0; i<[arrayOfJson count]; i++) {
                //DLog(@"artist songs loop");

                NSMutableDictionary *songDico=[arrayOfJson objectAtIndex:i];

                DCKeyValueObjectMapping *parser = [DCKeyValueObjectMapping mapperForClass: [Song class]];

                Song *song = [parser parseDictionary:songDico];
                song.artist=artist;




                [globalHelper insertToDB:song];

                [self getLyricsWhereArtist:artist andSong:song.song];
            }



        });

    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response,
                NSError *error, id JSON) {
        DLog(@"Request Failure Because %@",[error userInfo]);
    }];


    [operation start];

}

最佳答案

如果您有多个线程更新数据库,您可以为 SQLite 交互创建一个专用的串行队列,并将所有数据库交互分派(dispatch)到该单个队列。这样,即使您有多个线程执行网络操作,您也可以将所有数据库更新分派(dispatch)到这个新的专用队列,这将完全消除所有数据库争用问题。您的数据库更新可能会失败,因为您有多个线程试图更新同一个数据库,其中一些可能会失败。

您怀疑数据库更新可能会悄无声息地失败这一事实令人担忧。您可能没有检查所有 SQLite 调用的返回码吗?检查返回码每个 SQLite 调用确实很重要,如果失败,查看sqlite3_errmsg(或者如果使用 FMDB,lastErrorMessage) .如果你不这样做,你就是瞎了眼。此时您很幸运,问题很明显,但下一次问题可能会更微妙,您会费尽心机地找出问题所在。

最后,由于您已经在使用 AFNetworking,我还建议您考虑使用 AFHTTPRequestManager。具体来说,不是自己构建 URL,而是使用 GET 方法,传递 params 字典。您的 stringByAddingPercentEncodingWithAllowedCharacters 代码通常可以工作,但在某些情况下可能会失败(值得注意的是,您的参数值在不太可能的情况下包含 +&它)。此外,如果您使用 GET 并将请求管理器的 operationQueue.maxConcurrentOperationCount 设置为合理的值,例如4,您还将消除请求在慢速连接上不必要地超时的可能性。总之,AFHTTPRequestManager 会处理一些微妙的网络问题,但您当前的实现不会。

关于ios - for 循环中的异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22748677/

有关ios - for 循环中的异步任务的更多相关文章

  1. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  2. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  3. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  4. ruby - 如何使用 RSpec::Core::RakeTask 创建 RSpec Rake 任务? - 2

    如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake

  5. ruby-on-rails - Rails 中的 NoMethodError::MailersController#preview undefined method `activation_token=' for nil:NilClass - 2

    似乎无法为此找到有效的答案。我正在阅读Rails教程的第10章第10.1.2节,但似乎无法使邮件程序预览正常工作。我发现处理错误的所有答案都与教程的不同部分相关,我假设我犯的错误正盯着我的脸。我已经完成并将教程中的代码复制/粘贴到相关文件中,但到目前为止,我还看不出我输入的内容与教程中的内容有什么区别。到目前为止,建议是在函数定义中添加或删除参数user,但这并没有解决问题。触发错误的url是http://localhost:3000/rails/mailers/user_mailer/account_activation.http://localhost:3000/rails/mai

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

  7. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

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

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

  9. ruby-on-rails - 复数 for fields_for has_many 关联未显示在 View 中 - 2

    目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi

  10. 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使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

随机推荐