Ios Swift-从CoreData加载/保存生成重复条目
我遇到了一个问题,我可以在iOS应用程序的Swift中保存和加载CoreData,但我遇到了一个问题,我试图防止重复条目,但它似乎不起作用。谁能告诉我哪里出了问题?谢谢 我的ViewController类:Ios Swift-从CoreData加载/保存生成重复条目,ios,swift,core-data,Ios,Swift,Core Data,我遇到了一个问题,我可以在iOS应用程序的Swift中保存和加载CoreData,但我遇到了一个问题,我试图防止重复条目,但它似乎不起作用。谁能告诉我哪里出了问题?谢谢 我的ViewController类: import UIKit import CoreData class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { @IBOutlet weak var header
import UIKit
import CoreData
class ViewController: UIViewController, UITableViewDelegate,
UITableViewDataSource {
@IBOutlet weak var headerLabel:UILabel!
@IBOutlet weak var myTableView: UITableView!
var lenders = [LenderData]()
var lendersTemp = [LenderData]()
override func viewDidLoad() {
super.viewDidLoad()
self.myTableView.rowHeight = 90
myTableView.delegate = self
myTableView.dataSource = self
let fetchRequest: NSFetchRequest<LenderData> = LenderData.fetchRequest()
do {
let lenders = try PersistenceService.context.fetch(fetchRequest)
self.lenders = lenders
} catch {
// Who cares....
}
downloadJSON {
for tempLender in self.lendersTemp {
if !self.lenders.contains(where: {$0.id == tempLender.id}) {
self.lenders.append(tempLender)
}
}
self.lendersTemp.removeAll()
PersistenceService.saveContext()
self.myTableView.reloadData()
}
}
func downloadJSON(completed: @escaping () -> ()) {
let url = URL(string: "https://api.kivaws.org/v1/loans/newest.json")
let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
if error != nil {
print("JSON not downloaded")
} else {
if let content = data {
do {
let myJSONData = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject
var imageID:Int64 = -1
var country:String = "N/A"
var latLongPair:String = "0.000000 0.000000"
var town:String = "N/A"
if let loans = myJSONData["loans"] as? NSArray {
for i in 0...loans.count-1 {
if let lender = loans[i] as? NSDictionary {
if let imageData = lender["image"] as? NSDictionary { imageID = imageData["id"] as! Int64 }
if let countryData = lender["location"] as? NSDictionary {
country = countryData["country"] as! String
town = countryData["town"] as! String
if let geo = countryData["geo"] as? NSDictionary {
latLongPair = geo["pairs"] as! String
}
}
let newLender = LenderData(context: PersistenceService.context)
newLender.id = lender["id"] as! Int64
newLender.name = lender["name"] as? String
newLender.image_id = imageID
newLender.activity = lender["activity"] as? String
newLender.use = lender["use"] as? String
newLender.loan_amount = lender["loan_amount"] as! Int32
newLender.funded_amount = lender["funded_amount"] as! Int32
newLender.country = country
newLender.town = town
newLender.geo_pairs = latLongPair
self.lendersTemp.append(newLender)
}
}
}
DispatchQueue.main.async {
completed()
}
} catch {
print("Error occured \(error)")
}
}
}
}
task.resume()
}
}
导入UIKit
导入CoreData
类ViewController:UIViewController、UITableViewDelegate、,
UITableViewDataSource{
@IBVAR弱磁头标签:UILabel!
@ibvar myTableView:UITableView!
var贷方=[LenderData]()
变量lenderTemp=[LenderData]()
重写func viewDidLoad(){
super.viewDidLoad()
self.myTableView.rowHeight=90
myTableView.delegate=self
myTableView.dataSource=self
let fetchRequest:NSFetchRequest=LenderData.fetchRequest()
做{
let lenders=try PersistenceService.context.fetch(fetchRequest)
自我放贷者=放贷者
}抓住{
//谁在乎。。。。
}
下载JSON{
对于self.lendersTemp中的tempLender{
if!self.lenders.contains(其中:{$0.id==tempLender.id}){
self.lenders.append(tempLender)
}
}
self.lendersTemp.removeAll()
PersistenceService.saveContext()
self.myTableView.reloadData()
}
}
func下载JSON(已完成:@escaping()->()){
让url=url(字符串:https://api.kivaws.org/v1/loans/newest.json")
让task=URLSession.shared.dataTask(带:url!){(数据、响应、错误)在
如果错误!=nil{
打印(“未下载JSON”)
}否则{
如果让内容=数据{
做{
让myJSONData=try JSONSerialization.jsonObject(使用:content,options:JSONSerialization.ReadingOptions.mutableContainers)作为任意对象
var-imageID:Int64=-1
变量国家/地区:String=“不适用”
var latLongPair:String=“0.0000000.000000”
var town:String=“不适用”
如果let loans=myJSONData[“loans”]as?NSArray{
对于0…贷款中的i。计数-1{
如果let lender=贷款[i]为?NSD{
如果让imageData=lender[“image”]as?NSDictionary{imageID=imageData[“id”]as!Int64}
如果让countryData=贷方[“位置”]作为NSDictionary{
country=countryData[“country”]作为!字符串
town=countryData[“town”]作为!字符串
如果让geo=countryData[“geo”]作为NSDictionary{
latLongPair=geo[“pairs”]作为!字符串
}
}
let newLender=LenderData(上下文:PersistenceService.context)
newLender.id=lender[“id”]as!Int64
newLender.name=贷款人[“名称”]作为?字符串
newLender.image\u id=imageID
newleander.activity=贷方[“活动”]作为?字符串
newLender.use=lender[“use”]作为字符串
newLender.loan\u amount=贷款人[“loan\u amount”]as!Int32
newLender.funded_amount=贷款人[“funded_amount”]as!Int32
newLender.country=国家
newLender.town=城镇
newLender.geo_pairs=latLongPair
self.lendersTemp.append(新贷款人)
}
}
}
DispatchQueue.main.async{
已完成()
}
}抓住{
打印(“发生错误\(错误)”)
}
}
}
}
task.resume()
}
}
编辑
添加了我填充
lendersTemp
数组的代码部分我在注释中引用了matt的话:
所以。。。您正在后台线程上附加self.lendersTemp,但在主线程上读取它。相反,去掉它,只需将数据直接传递给已完成的函数即可
这正是我所做的。这项工作您的代码似乎依赖于从未设置的
self.lendersTemp
。类似地,如果让content=data获取JSON并说,但是content
永远不会被使用。您似乎遗漏了这个难题的关键部分。在我的ViewDidLoad()方法中,我调用了downloadJSON,其中有一个for-in循环,我使用lendersTemp数组,并在JSON下载完成后对照lenders数组检查该数组。或者在我看来,这就是我所做的。我完全错了吗?:)我只能看到你给我看的东西。我看到的是您展示的downloadJSON
,它对下载的JSON没有任何作用;它只是把它扔掉。您显示的任何代码行都不会将任何内容放入lendersTemp
。所以它永远是空的。我现在已经更新了代码,包含了lendersTemp被填充的部分,所以。。。您在后台线程上附加到self.lendersTemp
,但在主线程上读取它。相反,去掉它,只需将数据直接传递到completed
函数即可。