2014-05-23 152 views
1

只是想知道是否可以取消或停止選擇語句?如何停止/終止ultralite SELECT語句?

我有一個應用程序與sap ultralite數據庫。數據庫連接和語句在單例中處理。

我有一個ViewController在那裏我開始一個沉重的READ - 在後臺有時需要2-3s的操作。在同一個ViewController中,您可以更改一些值並將其保存爲WRITE-操作,該操作忽略了ViewController

我的問題是,如果我真的快和/或READ - 操作很慢,我的ViewController沒有被駁回,因爲WRITE操作正在等待READ誠合作的結束。所以UI凍結了幾秒鐘。

要麼感謝我的谷歌搜索技能或可憐的ultralite文檔,沒有人知道,我怎樣才能取消當前正在進行的SELECT -statement?(結果不再重要,因爲View將被解僱)或者我怎樣才能同時允許多個陳述?該READWRITE操作不同的表時,如果這是很重要

編輯:(總結題)

  1. 是否有可能READWRITE在同一時間的UltraLite
  2. 如果沒有,是否還有其他解決方案? (目前,我們測試複製的數據庫)

UPDATE(詳細): 嗯,我們發現了一個變通,但這並不回答這個問題。

我們有一個應用程序一個ShoppingCardListView(項存儲在UltraLite數據庫)。在此視圖中,您可以在Freeform-ViewController內更改項目(更改運輸日期,數量...),其中顯示了一些統計數據

統計信息是繁重的READ操作,有​​時最多需要5秒。所以,如果你例如更改項目的金額,然後按DONE鍵,Freeform-ViewController開始WRITE -operation(UPDATE),被駁回,ShoppingCard被(再次READ到數據庫中得到改變)進行更新。

最後一點是壞事,但我們實現了FreeformVC的完成處理程序,它只更新一個項目,而不是從數據庫的READ整個購物卡。這似乎工作,但是,這不是最好的解決方案。如果你點擊得非常快,你有時會覺得延遲,如果你想再次從數據庫中讀取,所以的問題依然存在....

+1

您可以將您的讀/寫操作放在後臺隊列中,以便您的UI保持響應。您可以使用Grand Central Dispatch('dispatch_async'到後臺隊列,然後在完成讀取/寫入時返回到主隊列)或「NSOperationQueue」。只要確保你的數據庫類是線程安全的。 –

+0

@AaronBrager:讀/寫操作在後臺。如果'READ'花費的時間過長,所以第二個'WRITE'語句必須等待,直到第一個準備好(< - 這會導致'UI'凍結) – longilong

+0

如果'WRITE'語句處於背景,那麼它不應該導致UI凍結。什麼阻止主線程? –

回答

0

首先 移動你的數據庫查詢代碼到另一個隊列(這是一個很好的做法)

解決方法是:開始排隊的數據庫操作。 該解決方案是很容易的,關鍵是要派遣你的數據庫查詢到另一個隊列

 
// Your read operation 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     // Query here 
     // .... 
     // Move back to Main queue 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      // Update UI 
     }); 
    }); 

在這之後你的寫操作做同樣的事情

 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
    // Write operation 
    // .... 
}); 

該解決方案將不會取消讀操作,但用戶界面不會凍結(ViewController會關閉,但這些操作會一直運行直到完成)。

另一種可能的方式:由於ultralite數據庫沒有記錄......我認爲可能的方法之一是銷燬和創建管理器實例(修改你的單例類到非單例),如果這不會崩潰,它將取消正在運行的操作。

另一種可能的方法:要使用NSOperations,並嘗試取消操作...也許「超級」將檢查取消狀態,並將停止查詢。