在从SQLite DB中删除之前等待API响应

时间:2017-04-19 19:41:11

标签: ios objective-c json sqlite

我无法在JSON响应后找到一种从SQLite DB中删除信息的有效方法。

基本上我要做的是:

我有一个包含100条记录的数据库。

  1. 我读了第一条记录
  2. 构建一个JSON包并将其发送到我的API。
  3. 等待API回复“确定”或“失败”
  4. 在OK上删除数据库中的记录。
  5. 转到下一条记录。
  6. 在我可以删除并继续之前等待回复之间有一段时间。

    enter image description here

    一个简单的 FOR 似乎无法正常工作,因为它无法等待“好”。来自API。

    我查看了dispatch_async(dispatch_get_main_queue());但是如果确定来了并且数据库正在处理它将在访问数据库时锁定数据库并且逻辑因数据库被锁定而失败。

    我需要两者的混合物。有没有人知道教程或从哪里开始这样的事情?

3 个答案:

答案 0 :(得分:1)

使用操作队列和您自己的自定义操作。将操作队列设置为串行或将其设置为允许少量并发操作。

遍历每条记录,为每条记录创建一个操作。将每个操作放在队列中。

该操作的实现将是进行API调用,然后删除一条记录,如果该API调用表明它应该被删除。确保在API调用完成之前,操作main未到达终点。

答案 1 :(得分:0)

创建一个数组,暂时保存要删除的数据

-adfaa123sdfasdf

成功收到回复后,您可以将要删除的项目附加到此数组中。在所有呼叫中成功执行相同的过程。完成上次成功或失败响应后上传数据后,在for循环中检查itemsToDelete数组并删除数据库中的所有内容

答案 2 :(得分:0)

我建议使用块来接收来自异步调用的响应。在这种情况下,您可以在块中执行DB操作。

dispatch_async(dispatch_get_main_queue());不适用于异步调用。它主要用于更新UI。

所有异步调用都需要在后台线程上完成。

遇到你的问题,你可以这样做:

-(void)checkToDeleteWithCompletion:(MyCompletion)completion{

    __block NSMutableArray *responseArray =  [NSMutableArray array];

  // Create a dispatch group
    dispatch_group_t group = dispatch_group_create();

    for (int i = 0; i < yourArray.count; i++) {
        // Enter the group for each request we create
        dispatch_group_enter(group);

            [self ..methodToPErformAsynccallWithCOmpleton success:^(BOOL success, id response) {
                dispatch_group_leave(group);
                 [responseArray addObject:response];

            } failure:^(NSError *error, NSInteger statusCode) {
                dispatch_group_leave(group);
            }];
     }

    // Here we wait for all the requests to finish
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        // Do whatever you need to do when all requests are finished
        completion(YES,[responseArray copy]);
    });
}

最后,您可以在responseArray上使用for循环来删除不需要的对象。

您还可以使用以下方法限制并发呼叫数:

dispatch_semaphore_create(maxConcurrencyValue)

或者你可以按照rmaddy的建议使用NSOperation!