Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 更新coredata时发生崩溃_Json_Swift_Tableview - Fatal编程技术网

Json 更新coredata时发生崩溃

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.

我的代码在更新核心数据时显示为chrashesh,或者我的tableview单元格为空。我将json数据保存在coredata中,并在表视图中显示它。为什么我不能更新我的数据。我的代码有问题吗? 对于这些类型的案例,批量更新是更好的选择吗

func updatestores(){

让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()
    }
}