菜鸟教程小白 发表于 2022-12-12 09:05:43

ios - for循环中的异步任务


                                            <p><p>我希望它们执行三个方法,如下所示:</p>

<pre><code>+(void)method1{
    // Some code
    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
      for (int i=0; i&lt;count; i++) {
            //getting object(x) from json
            ;//trigger method2
      }
    });
}

+(void)method2:(NSString*)x{
// Some code
    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
      for (int i=0; i&lt;count; i++) {
            //getting objects(y,z) from json
            //SAVE that object in SQLite database
            ;//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&lt;count; i++) {
            //getting object from json
            //SAVE that object in SQLite database
      }
    });
}
</code></pre>

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

<p>编辑:</p>

<pre><code>+(void)getData:(NSString*)artist{

    LKDBHelper* globalHelper = ;

    NSMutableArray *arrayOfSongs=[init];
    artist = ;

    //DLog(@&#34;artisttt %@&#34;,artist);

    NSString *url=;

    url = ;

    //NSLog(@&#34;url %@&#34;,url);

    NSURL *urlChannels= [ NSURL URLWithString:url];


    NSURLRequest *request = ;

    ];

    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&lt;; i++) {
                //DLog(@&#34;artist songs loop&#34;);

                NSMutableDictionary *songDico=;

                DCKeyValueObjectMapping *parser = ];

                Song *song = ;
                song.artist=artist;




                ;

                ;
            }



      });

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


    ;

}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>如果您有多个线程更新数据库,您可以为您的 SQLite 交互创建一个专用的串行队列,并将所有数据库交互分派(dispatch)到该单个队列。这样,即使您有多个线程执行网络操作,您也可以将所有数据库更新分派(dispatch)到这个新的专用队列,这将完全消除所有数据库争用问题。您可能会遇到数据库更新失败,因为您有多个线程试图更新同一个数据库,其中一些可能会失败。 </p>

<p>您怀疑数据库更新可能会静默失败的事实令人担忧。您可能没有检查您的 SQLite 调用的 <em>all</em> 的返回码吗?检查返回码<em>每个</em> SQLite 调用真的很重要,如果失败,查看<code>sqlite3_errmsg</code>(或者如果使用FMDB,<code>lastErrorMessage</code>) .如果你不这样做,你只是在盲目飞行。幸运的是,此时问题很明显,但下一次问题可能会更微妙,你会费尽心思追查问题。</p>

<p>最后,既然您已经在使用 AFNetworking,我还建议您考虑使用 <code>AFHTTPRequestManager</code>。具体来说,与其自己构建 URL,不如使用 <code>GET</code> 方法,传递 <code>params</code> 字典。您的 <code>stringByAddingPercentEncodingWithAllowedCharacters</code> 代码通常可以工作,但在某些情况下可能会失败(尤其是您的参数值包含 <code>+</code> 或 <code>&</code> 的不太可能的情况它)。此外,如果您使用 <code>GET</code> 并将请求管理器的 <code>operationQueue.maxConcurrentOperationCount</code> 设置为合理的值,例如4,您还将消除在慢速连接上请求不必要地超时的可能性。归根结底,<code>AFHTTPRequestManager</code> 会处理一些微妙的网络问题,但您当前的实现不会。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - for循环中的异步任务,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/22748677/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/22748677/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - for循环中的异步任务