2017-01-06 18 views
0

我剛剛開始,我用UserDefaults一次或兩次,從未使用CoreData,所以我不知道在這種情況下使用。我有一個表格視圖,它具有從一個空數組填充的單元格,該數組由一組字符串填充,具體取決於頁面標題。CoreData VS UserDefaults用於保存用戶刪除

換句話說,我在viewDidLoad中的函數,它檢查navigationItem.title,並根據它是什麼,填充用正確的字符串的空數組。一切都加載好,但我需要刪除的項目,以保持刪除。這裏是我的代碼:

初始化:

static var places = [String]() 
    var nycPlaces = ["Central Park", "Rockefeller Center", "Empire State Building"] 
    var londonPlaces = ["London Eye", "Windsor Castle", "Tower of London"] 
    var parisPlaces = ["Champs Elysee", "Eiffel Tower", "Catacombs"] 

這是填充與正確的數組表視圖的功能 - 這就是所謂的在viewDidLoad中:

func populateCells() { 

    switch navigationItem.title { 
    case "New York": 
     ListController.places = nycPlaces 
    case "London": 
     ListController.places = londonPlaces 
    default: 
     ListController.places = parisPlaces 
    } 

    tableView.reloadData() 
} 

,並刪除,我有:

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 
{ 
    if editingStyle == .delete 
    { 
     tableView.beginUpdates() 
     ListController.places.remove(at: indexPath.row) 
     tableView.deleteRows(at: [indexPath], with: .fade) 
     tableView.endUpdates() 
    } 
} 

問題是,當我離開頁面,然後重新導航 - 加載它,空數組重新與3個字符串關聯,而不管之前已刪除哪些。我如何確保刪除的單元格不會回來?

感謝您的幫助!

+1

我要去對照以下問題的答案,說:「學習和使用枚舉核心數據「。試圖使用戶默認操作作爲對象持久性系統,最終會浪費時間,因爲您的應用程序或您的需求變得更加複雜。 – Paulw11

+0

這是一個公平的評論@ Paulw11。這確實取決於你打算如何複雜。如果您希望這些列表在某個地方被RESTful服務的響應填充,或者您希望可能擁有更多類型的位置或子區域,那麼CoreData可能是更可行的選擇。此外,CoreData是一個很好的事情知道無論:) – Jake

回答

0

您應該使用UserDefaults如果你的應用程序是一個簡單的,你發佈的代碼(即您沒有從一些遠程服務器獲取數據時,它真的只是幾個硬編碼值)。

CoreData有一個陡峭的學習曲線,它是很難使用,而且很難正確使用。對於你所呈現的場景來說這太過於誇張了。另外請注意:如果你不需要這個來保存你的進程退出並重新啓動,你可以創建可變的數組,這些數組可以存放在你的所有類(例如你的AppDelegate,一個全局的單例類,無論什麼)都可以訪問的地方,修改它們到位。

0

由於這主要是靜態數據,我建議不要有CoreData的開銷。相反,我會用這種方法:

var nycPlaces: [String] { 
    get { 
     guard let retval = UserDefaults.standard.object(forKey: "nyc") as? [String] else { 
      return ["Central Park", "Rockefeller Center", "Empire State Building"] 
     } 

     return retval 
    } set { 
     UserDefaults.standard.set(newValue, forKey: "nyc") 
     UserDefaults.standard.synchronize() 
    } 
} 

var londonPlaces: [String] { 
    get { 
     guard let retval = UserDefaults.standard.object(forKey: "london") as? [String] else { 
      return ["London Eye", "Windsor Castle", "Tower of London"] 
     } 

     return retval 
    } set { 
     UserDefaults.standard.set(newValue, forKey: "london") 
     UserDefaults.standard.synchronize() 
    } 
} 

var parisPlaces: [String] { 
    get { 
     guard let retval = UserDefaults.standard.object(forKey: "paris") as? [String] else { 
      return ["Champs Elysee", "Eiffel Tower", "Catacombs"] 
     } 

     return retval 
    } set { 
     UserDefaults.standard.set(newValue, forKey: "paris") 
     UserDefaults.standard.synchronize() 
    } 
} 

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 
{ 
    if editingStyle == .delete 
    { 
     tableView.beginUpdates() 
     ListController.places.remove(at: indexPath.row) 

     switch navigationItem.title { 
     case "New York": 
      nycPlaces = ListController.places 
     case "London": 
      londonPlaces = ListController.places 
     default: 
      parisPlaces = ListController.places 
     }    

     tableView.deleteRows(at: [indexPath], with: .fade) 
     tableView.endUpdates() 
    } 
} 

P.S. - 我還建議在更全局範圍有這個數據,並使用的,而不是做字符串比較反對您的導航項目的標題:)

+0

有沒有必要調用'同步' – Paulw11

+0

所以我給了這個鏡頭,但我試圖刪除時崩潰:***由於未捕獲的異常終止應用程序'NSInternalInconsistencyException ',原因:'無效的更新:0節中的行數無效。更新(3)後,現有節中包含的行數必須等於更新前(3)中該節中包含的行數,加上或減去從該節插入或刪除的行數(插入0 ,刪除1個),加上或減去移入或移出該部分的行數(移入0,移出0)。 – d0xi45

+0

也是FYI我解開了navigationItem.title,並切換nycPlaces = ListController.places是相反的方式等。 – d0xi45