簡體   English   中英

如何同步使用Core Data?

[英]How to use Core Data synchronously?

我正在嘗試使用Swift制作iOS 8應用程序,我需要從JSON下載數據並保存,但我不了解Core Data機制。 (我來自Android的ORM Lite和Windows Phone的sqlite-net)。

我正在嘗試做兩個任務,“GetAllNewsTask”從數據庫返回所有新聞,“UpdateAllNewsTask”下載JSON並解析它,保存到數據庫並返回所有新聞。

函數getEntitiesFromJson將JSON字符串轉換為實體對象

class func getEntitiesFromJson(json: JSONValue) -> [NewsEntity]?{
    var rList : [NewsEntity] = []

    var array = json.array
    var countItr = array?.count ?? 0

    if(array == nil){
        return nil
    }

    if(countItr > 0){
        for index in 0...countItr-1{
            var news = NewsEntity()
            var jsonVal = array?[index]

            news.id = jsonVal?["id"].integer ?? 0
            ........

            rList.append(news)
        }
    }

    return rList
}

GetAllNewsTask(newsDao.findAll()當前返回一個harcoded空數組,我沒有找到如何同步選擇所有NewsEntity)

class GetAllNewsTask:NSOperation {

var result : Array<News>?

override func main() -> (){
    result = executeSync()
}

func executeSync() -> Array<News>? {
    let newsDao = NewsDAO()
    let entities = newsDao.findAll()

    return NewsModel.getVOsFromEntities(entities)
}

UpdateAllNewsTask

class UpdateAllNewsTask:NSOperation {

var result : Array<News>?

override func main() -> (){
    result = executeSync()
}

func executeSync() -> Array<News>? {

    let response = JsonServices.getAllNews()
    var managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext!
    var entityDescription = NSEntityDescription.entityForName("NewsEntity", inManagedObjectContext: managedObjectContext)
    var entities = NewsModel.getEntitiesFromJson(response)

    //TODO insert new, update existing and remove old

    return GetAllNewsTask().executeSync()
}

我正在嘗試添加或更新所有NewsEntity並刪除舊的,在Java中我使用了List.removeAll(Collection<T>)但我找不到如何在Swift中執行此操作。 當我在NewsEntity類中重寫equals和hashcode時出現異常。

在繼續之前,這是正確的方法嗎? 如果是,有任何好的教程演示如何做到這一點? 如果沒有什么是正確的方法?

通常,核心數據事務應始終在對象的托管對象上下文線程上執行。 因此,您將在NSManagedObjectContext看到performBlockperformBlockAndWait調用。

由於您正在使用主線程,因此假設您在主線程上進行了這些更新調用,那么您在技術上是同步的。 如果你不是那么我會建議將你的同步調用包裝成performBlockAndWait調用。

話雖如此,您應該利用Apple的文檔來解釋如何實現多線程核心數據。 您應該始終在后台線程上執行與服務器相關的更新。

如果要實現removeAll功能,則需要手動獲取要刪除的所有對象並調用context.deleteObject(managedObject) 或者,如果您想要更強大的功能來強制執行級聯刪除,則可以在選擇關系時在模型編輯器中進行設置。 可以使用以下刪除規則:

  • 廢止
  • 級聯
  • 沒有行動
  • 拒絕

最后,您可能會發現這篇文章有助於解釋一些常用的Core Data堆棧設置以及每種設置的各種性能。

歡迎來到iOS,祝你好運:)

編輯

另外,你可能會發現Ray Wenderlich提供了一些很棒的核心數據教程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM