我正在尝试使用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时,我遇到了异常。
在继续之前,这是正确的方法吗? 如果是,有任何好的教程演示如何做到这一点? 如果没有正确的方法?
答案 0 :(得分:5)
通常,核心数据事务应始终在对象的托管对象上下文线程上执行。因此,您会在performBlock
中看到performBlockAndWait
和NSManagedObjectContext
来电。
由于您正在使用主线程,因此假设您在主线程上进行了这些更新调用,那么您在技术上是同步的。如果你不是那么我会建议你将同步电话打包成performBlockAndWait
电话。
话虽如此,您应该在主题上使用Apple's Documentation,因为它们解释了如何实现多线程核心数据。您应该始终在后台线程上执行与服务器相关的更新。
如果要实现removeAll功能,则需要手动获取要删除的所有对象并调用context.deleteObject(managedObject)
。或者,如果您想要更强大的功能来强制执行级联删除,则可以在选择关系时在模型编辑器中进行设置。可以使用以下删除规则:
最后,您可能会发现this post有助于解释一些常用的核心数据堆栈设置以及每种设置的各种性能。
欢迎来到iOS,祝你好运:)
修改强>
另外,你可能会发现Ray Wenderlich提供了一些很棒的Core Data Tutorials