2017-04-19 61 views
0

我很難想出一種從JSON響應後從SQLite數據庫中刪除信息的有效方法。在從SQLite刪除數據庫之前等待API響應

基本上怎麼樣,我要做的是:

我有100個記錄的數據庫。

  1. 我讀的第一條記錄
  2. 構建JSON包,並將其發送給我的API。
  3. 等待API響應OK或FAIL
  4. 將刪除數據庫記錄就OK了。
  5. 移至下一條記錄。

在我可以刪除和繼續之前等待響應有一段時間。

enter image description here

簡單FOR似乎並沒有工作,因爲它不能等待從API「確定」。

我看着dispatch_async(dispatch_get_main_queue());但如果OK來了,數據庫正在處理它將鎖定數據庫,當它被訪問和邏輯失敗,因爲數據庫被鎖定。

我需要兩者的混合物。有誰知道一個教程或從哪裏開始這樣的事情?

+0

你打算循環訪問100條記錄,詢問遠程服務「我可以刪除這個嗎?」 - 每次都在等待迴應? – DonMag

+0

是的,這是正確的。 –

+0

使用塊接收異步響應,並在收到響應時在塊中執行sqlite操作。 –

回答

0

創建一個數組,你會暫時保持數據刪除

NSMutableArray* itemsToDelete = [[NSMutableArray alloc] init] 

一旦你收到你追加項目被刪除此陣成功的響應。所有通話成功完成相同的過程。一旦你與成功或失敗的最後一次響應上傳數據檢查內itemsToDelete陣列循環,並從您的數據庫

+0

這個問題被標記爲Objective-C。 – rmaddy

+0

@rmaddy謝謝將代碼行從swift更改爲objective-c –

1

使用操作隊列和自己的自定義操作刪除完成這一切。將操作隊列設置爲串行或將其設置爲允許少量併發操作。

循環遍歷每條記錄爲每條記錄創建一個操作。將每個操作放在隊列中。

操作的實施將是使API調用,然後刪除一條記錄如果API調用表明它應該被刪除。確保操作的main在API調用完成之前未達到其結尾。

+0

使用'nsoperationqueue'會幫助我完成這個任務嗎? –

+0

我還沒有使用Swift。仍然Objective-C。 –

+0

是的,'NSOperatationQueue'和'NSOperation'。 – rmaddy

0

我建議使用塊來接收來自異步調用的響應。在這種情況下,您可以在塊中執行數據庫操作。

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循環,刪除不需要的對象。

您也可以通過限制併發呼叫的數量:

dispatch_semaphore_create(maxConcurrencyValue) 

或者你可以使用的NSOperation通過rmaddy的建議!

+0

這種方法存在一個嚴重的缺陷 - 您最終會對API發出'yourArray.count'併發請求。這通常是一個壞主意。 – rmaddy

+0

據我所知,我們不能爲N個異步API調用創建N個完成塊。 @rmaddy。如果你知道更好的處理方法,請指導我!謝謝!我嘗試了一些可怕的方式後,最終結束了這個! –

+1

查看我的答案以獲得更好的方式(至少在確保只有有限數量的併發API調用方面更好)。 – rmaddy

相關問題