Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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
Ios Swift-从CoreData加载/保存生成重复条目_Ios_Swift_Core Data - Fatal编程技术网

Ios Swift-从CoreData加载/保存生成重复条目

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

我遇到了一个问题,我可以在iOS应用程序的Swift中保存和加载CoreData,但我遇到了一个问题,我试图防止重复条目,但它似乎不起作用。谁能告诉我哪里出了问题?谢谢

我的ViewController类:

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
函数即可。