2015-07-10 70 views
2

我正在使用Realm並嘗試在我的TableView中重新排序單元格。行爲,我覺得奇怪的是,它的工作原理有時酷似我希望(它正確地更新領域中的數據),但有時當它擊中行:Realm.write正在被跳過

myRealm.write { 

使它不會將該塊中去。使用斷點我可以看到它跳過整個塊並直接跳到這個塊的末尾。正因爲如此,儘管它給出了tableView已被重新排序的視覺外觀,但它並未在Realm中重新排序。

我應該注意到,我在Realm的一個表中使用一個叫做order的列作爲存儲順序的一種手段。此外,標籤是從表的境界,我想訂購

override func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) { 

     //update when you move a row up 
     if sourceIndexPath.row > destinationIndexPath.row { 
      let lowerbound = destinationIndexPath.row 
      let upperbound = sourceIndexPath.row 
      do{ 
       let myRealm = try Realm() 

       myRealm.write { 

        let labelAtSource = self.labels![upperbound] 
        labelAtSource.order = lowerbound 

        for i in lowerbound...upperbound-1{ 
         let label = self.labels![i] 
         label.order = i+1 
        } 
       } 
      }catch { } 
     }else{ //when you move a row down 
      let lowerbound = sourceIndexPath.row 
      let upperbound = destinationIndexPath.row 
      do{ 
       let myRealm = try Realm() 

       myRealm.write { 

        let labelAtSource = self.labels![lowerbound] 
        labelAtSource.order = upperbound 

        for i in lowerbound+1...upperbound{ 
         let label = self.labels![i] 
         label.order = i-1 
        } 
       } 
      }catch { } 
     } 
} 
+0

您在寫電話之前正在嘗試使用。也許它失敗了,所以它不再執行寫操作。在catch塊中寫一個日誌,看它是否進入。 – pteofil

+0

它將通過try並且無法運行myRealm.write塊,我做了一個gif向您展示當我在try上放置斷點時會發生什麼。 https://i.imgur.com/pqT6a4B.gif – dmathewwws

+0

我不知道這是爲什麼,但我相信你的領域不能初始化,所以調用一個無塊對象的寫塊,只是忽略它。在嘗試寫入之前,能否檢查是否獲得有效的領域對象? – pteofil

回答

0

你調用一個DO-catch塊投擲初始化Realm()沒有任何錯誤處理,在所有的陣列。我猜這是失敗的。 而不是捕捉錯誤,讓它消失未處理,我寧願推薦使用try!,這會導致運行時錯誤在這裏。

但是,您還應該確保您至少在初次訪問過您的域之前,以避免擔心此時失敗的模式遷移/驗證。通常僅在開發過程中才會看到大多數錯誤,這些錯誤在默認領域設置後可能會出現。當瀏覽器連接到模擬器文件時。

+0

它將通過try並且無法運行myRealm.write塊,我做了一個gif向您展示當我在try上放置斷點時會發生什麼。 https://i.imgur.com/pqT6a4B.gif – dmathewwws

+0

你能分享一個可重現的案例嗎?我們想進一步調查。 – marius

+0

也注意到同樣的問題,隨機開始,因爲他們總是發生。之前使用相同的代碼。寫塊不被執行。我有一個做...試試Realm()... catch _。 catch塊沒有執行(在那裏有一個斷點和打印信息)。我在後臺執行了這個操作'dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),{...}' – Ixx