alv*_*oun 3 json core-data ios swift
我正在尝试使用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
}
Run Code Online (Sandbox Code Playgroud)
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)
}
Run Code Online (Sandbox Code Playgroud)
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()
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试添加或更新所有NewsEntity并删除旧的,在Java中使用List.removeAll(Collection<T>)但我无法在Swift中找到如何执行此操作.当我在NewsEntity类中重写equals和hashcode时出现异常.
在继续之前,这是正确的方法吗?如果是,有任何好的教程演示如何做到这一点?如果没有什么是正确的方法?
通常,核心数据事务应始终在对象的托管对象上下文线程上执行.因此,您将看到performBlock和performBlockAndWait调用NSManagedObjectContext.
由于您正在使用主线程,因此假设您在主线程上进行了这些更新调用,那么您在技术上是同步的.如果你不是那么我会建议把你的同步电话打包成一个performBlockAndWait电话.
话虽如此,您应该利用Apple的文档来解释如何实现多线程核心数据.您应该始终在后台线程上执行与服务器相关的更新.
如果要实现removeAll功能,则需要手动获取要删除和调用的所有对象context.deleteObject(managedObject).或者,如果您想要更强大的功能来强制执行级联删除,则可以在选择关系时在模型编辑器中进行设置.可以使用以下删除规则:
最后,您可能会发现这篇文章有助于解释一些常用的Core Data堆栈设置以及每种设置的各种性能.
欢迎来到iOS,祝你好运:)
编辑
另外,你可能会发现Ray Wenderlich提供了一些很棒的核心数据教程