Json 更新coredata时发生崩溃
我的代码在更新核心数据时显示为chrashesh,或者我的tableview单元格为空。我将json数据保存在coredata中,并在表视图中显示它。为什么我不能更新我的数据。我的代码有问题吗? 对于这些类型的案例,批量更新是更好的选择吗 func updatestores(){Json 更新coredata时发生崩溃,json,swift,tableview,Json,Swift,Tableview,我的代码在更新核心数据时显示为chrashesh,或者我的tableview单元格为空。我将json数据保存在coredata中,并在表视图中显示它。为什么我不能更新我的数据。我的代码有问题吗? 对于这些类型的案例,批量更新是更好的选择吗 func updatestores(){ 让moc=coreData.persistentContainer.viewContext 让myUrlString=”https://hacker-news.firebaseio.com/v0/topstories.
让moc=coreData.persistentContainer.viewContext
让myUrlString=”https://hacker-news.firebaseio.com/v0/topstories.json"
guard let newsUrl=URL(字符串:myUrlString)else{return}
URLSession.shared.dataTask(with:newsUrl){(data,response,err)在
如果错误!=零{
打印(“获取数据时出错”,错误!)
返回
}
否则{
let group=DispatchGroup()
让jsonResult=try!JSONSerialization.jsonObject(with:data!)作为?[Int]else{return}
对于jsonResult中的一个元素{
让我的字符串=”https://hacker-news.firebaseio.com/v0/item/\(anInt.json)
guard let myUrl=URL(字符串:myString)else{return}
group.enter()
URLSession.shared.dataTask(带有:myUrl,completionHandler:{(数据,响应,err))在
如果错误!=零{
打印(“获取数据时出错”,错误!)
小组请假()
返回
}
否则{
guard let allData=try?JSONSerialization.jsonObject(with:data!)作为?[String:Any]其他{
小组请假()
返回
}
让context=self.coreData.persistentContainer.viewContext
let request=NSFetchRequest(entityName:“新闻”)
request.returnsObjectsAsFaults=true
做{
如果let result=try context.fetch(请求)as?[NSManagedObject]{
对于结果中的数据![NSManagedObject]{
self.dataArray.append(data.value(forKey:“id”)as!Int64)
}
将newId=(allData![“id”])设为?Int
self.idData=Int64(newId!)
self.idArray.append(self.idData)
如果self.dataArray.contains(self.idData){
打印(“是数据包含”)
返回
}
否则{
var新闻=新闻(上下文:moc)
如果让newTitle=(allData![“title”])作为?字符串{
结果[0]。设置值(newTitle,forKey:“title”)
印刷品(新标题)
}
如果让newScore=(allData![“score”])作为?Int{
结果[0]。设置值(Int16(新闻核心),forKey:“分数”)
}
如果让newId=(allData![“id”])作为?Int{
结果[0]。设置值(Int64(newId),forKey:“id”)
}
如果让newText=(allData![“text”])作为?字符串{
结果[0]。设置值(newText,forKey:“text”)
}
如果让newUrl=(allData![“url”])作为?字符串{
结果[0]。设置值(newUrl,forKey:“url”)
}
}
}
}抓住{
打印(“失败”)
}
小组请假()
}
})1.简历()
}
通知组(队列:DispatchQueue.main){
self.coreData.saveContext()
}
}
}1.简历()
DispatchQueue.main.async{
self.refresh.endRefreshing()
}
DispatchQueue.main.async{
self.tableView.reloadData()
}
}
代码的第一行还应缩进四个位置。还考虑添加更多吸引人的标签。SoLeTabVIEW。RealDeDATA()应该在组内。保存后通知(队列:Debug队列)
let moc = coreData.persistentContainer.viewContext
let myUrlString = "https://hacker-news.firebaseio.com/v0/topstories.json"
guard let newsUrl = URL(string: myUrlString) else { return }
URLSession.shared.dataTask(with: newsUrl) { (data, responce, err) in
if err != nil{
print("err in fetching data", err!)
return
}
else {
let group = DispatchGroup()
guard let jsonResult = try! JSONSerialization.jsonObject(with: data!) as? [Int] else { return }
for anInt in jsonResult {
let myString = "https://hacker-news.firebaseio.com/v0/item/\(anInt).json"
guard let myUrl = URL(string: myString) else { return }
group.enter()
URLSession.shared.dataTask(with: myUrl, completionHandler: { (data, responce, err) in
if err != nil {
print("err in fetching data", err!)
group.leave()
return
}
else {
guard let allData = try? JSONSerialization.jsonObject(with: data!) as? [String:Any] else {
group.leave()
return
}
let context = self.coreData.persistentContainer.viewContext
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "News")
request.returnsObjectsAsFaults = true
do {
if let result = try context.fetch(request) as? [NSManagedObject]{
for data in result as! [NSManagedObject] {
self.dataArray.append(data.value(forKey: "id") as! Int64)
}
let newId = (allData!["id"]) as? Int
self.idData = Int64(newId!)
self.idArray.append(self.idData)
if self.dataArray.contains(self.idData) {
print("yes data contains")
return
}
else{
var news = News(context: moc)
if let newTitle = (allData!["title"]) as? String{
result[0].setValue(newTitle, forKey: "title")
print(newTitle)
}
if let newScore = (allData!["score"]) as? Int{
result[0].setValue(Int16(newScore), forKey: "score")
}
if let newId = (allData!["id"]) as? Int{
result[0].setValue(Int64(newId), forKey: "id")
}
if let newText = (allData!["text"]) as? String{
result[0].setValue(newText, forKey: "text")
}
if let newUrl = (allData!["url"]) as? String{
result[0].setValue(newUrl, forKey: "url")
}
}
}
} catch {
print("Failed")
}
group.leave()
}
}).resume()
}
group.notify(queue: DispatchQueue.main) {
self.coreData.saveContext()
}
}
}.resume()
DispatchQueue.main.async {
self.refresher.endRefreshing()
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}