我正在从Json解析一些数据并保存到coredata中,在获取显示到tableview中的核心数据工作正常后,tableview重复显示所有值如何避免重复值我尝试了很多方法但找不到方法< / p>
Json格式
MAX_PROCESSES
时
这些是保存和获取代码
{
"contacts": [
{
"id": "c200",
"name": "Ravi Tamada",
"email": "ravi@gmail.com",
"address": "xx-xx-xxxx,x - street, x - country",
"gender" : "male",
"phone": {
"mobile": "+91 0000000000",
"home": "00 000000",
"office": "00 000000"
}
},
{
"id": "c201",
"name": "Johnny Depp",
"email": "johnny_depp@gmail.com",
"address": "xx-xx-xxxx,x - street, x - country",
"gender" : "male",
"phone": {
"mobile": "+91 0000000000",
"home": "00 000000",
"office": "00 000000"
}
},
{
"id": "c202",
"name": "Leonardo Dicaprio",
"email": "leonardo_dicaprio@gmail.com",
"address": "xx-xx-xxxx,x - street, x - country",
"gender" : "male",
"phone": {
"mobile": "+91 0000000000",
"home": "00 000000",
"office": "00 000000"
}
}
]
}
如何避免核心数据中的重复值并在tableview中显示正确的数据
答案 0 :(得分:2)
首先在getdata
中不要在循环的每次迭代中保存上下文,在循环后保存一次。
为避免重复从Core Data获取所有联系人,请将其映射到名称并检查数组是否包含收到的名称
func getdata()
{
let url = URL(string: "https://api.androidhive.info/contacts/")
let names : [String]
do {
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Contacts")
let fetchResults = try self.context.fetch(fetchRequest)
names = fetchResults.map{ $0.name }
} catch {
names = []
}
URLSession.shared.dataTask(with: url!) { (data, response, error) in
if error != nil { print(error!); return }
do {
let data = try JSONSerialization.jsonObject(with: data!) as! [String:Any]
let arraydata = data["contacts"] as! [[String:Any]]
for arravalues in arraydata
{
guard let name = arravalues["name"] as? String, !names.contains(name) else { continue }
let entityDescription = NSEntityDescription.entity(forEntityName: "Contacts", in:self.context)
let favouriteObj = Contacts(entity: entityDescription!, insertInto: self.context)
favouriteObj.name = name
favouriteObj.id = arravalues["id"] as? String
favouriteObj.email = arravalues["email"] as? String
favouriteObj.gender = arravalues["gender"] as? String
favouriteObj.address = arravalues["address"] as? String
}
try self.context.save()
} catch {
print("error",error)
}
}
.resume()
}
注意:
NSManagedObject
子类的非可选数组,该数组在成功时指定为通用类型。< / LI>
foo.count > 0
检查空数组,使用!foo.isEmpty
[String:Any]
而不是[String:AnyObject]
dataTask
完成块中的潜在错误。data
),以避免与Data
类型混淆。options
中的jsonObject(with
参数,因为结果显然是一个集合类型。答案 1 :(得分:0)
也许可以对fetch请求执行类似于How to get distinct results from a single field in Core Data (Swift 4)的操作,但另一种选择是通过简单地从获取结果创建一个集来删除重复项:
let fetchSet = Set(fetchResults)
并迭代整个集合