Json 将核心数据条目标记为收藏夹SWIFTUI
我正在开发一个应用程序,用于存储从在线Json到离线内容的CoreData的帖子。这是一个房地产列表应用程序,用户可以在其中出售和租赁房产 到目前为止,我已经完成了在CoreData中保存fethed列表的工作,但是我无法为现有条目实现“添加到收藏夹”。我使用NSPredicate在不同视图中筛选列表类型Json 将核心数据条目标记为收藏夹SWIFTUI,json,core-data,swiftui,Json,Core Data,Swiftui,我正在开发一个应用程序,用于存储从在线Json到离线内容的CoreData的帖子。这是一个房地产列表应用程序,用户可以在其中出售和租赁房产 到目前为止,我已经完成了在CoreData中保存fethed列表的工作,但是我无法为现有条目实现“添加到收藏夹”。我使用NSPredicate在不同视图中筛选列表类型 我已经创建了一个实体“列表” 和一个“最喜欢的”实体 我的问题是:如何实现“添加到收藏夹” 选项A:在另一个实体中再次保存“最喜爱”列表 选项B:在“列表”实体中创建另一个“是收藏夹”属性
struct ListingModel: Hashable, Decodable, Encodable, Identifiable {
var id : Int
var title : String
var category : String
var name : String
var image : String
var publishdate : String
var saleprice : Int = 0
var rentprice : Int = 0
var listingtype : String
var latitude : Double!
var longitude : Double!
}
//JSONViewModel.swift
导入快捷键
导入CoreData
类JSONViewModel:ObserveObject{
@已发布的var清单:[ListingModel]=[]
//@Published var tags:[tags]=[]
//正在将Json保存到核心数据。。。
func saveData(上下文:NSManagedObjectContext){
listings.forEach{(数据)位于
let entity=Listing(上下文:contex)
entity.title=data.title
entity.name=data.name
entity.category=data.category
entity.image=data.image
entity.publishdate=data.publishdate
entity.tagline=data.tagline
entity.content=data.content
entity.coverimage=data.coverimage
entity.saleprice=Int64(截断:NSNumber(值:data.saleprice))
entity.rentprice=Int64(截断:NSNumber(值:data.rentprice))
entity.phone=data.phone
entity.email=data.email
entity.area=Int64(截断:NSNumber(值:data.area))
entity.rooms=Int64(截断:NSNumber(值:data.rooms))
entity.beds=Int64(截断:NSNumber(值:data.beds))
entity.bathrooms=Int64(截断:NSNumber(值:data.bathrooms))
entity.expires=data.expires
entity.adresa=data.adresa
entity.listingtype=data.listingtype
entity.latitude=Double(截断:NSNumber(值:data.latitude))
entity.longitude=Double(截断:NSNumber(值:data.longitude))
}
// }
//一次保存所有挂起的数据
做{
尝试contex.save()
打印(“成功”)
}
抓住{
打印(错误。本地化描述)
}
}
func fetchData(上下文:NSManagedObjectContext){
让url=”https://... 我的api地址“
var request=URLRequest(url:url(string:url)!)
request.addValue(“swiftui2.0”,用于HttpHeaderField:“字段”)
let session=URLSession(配置:。默认值)
session.dataTask(with:request){(data,res,_)in
guard let jsonData=data else{return}
//检查错误
let response=res as!HTTPURLResponse
//按状态代码检查
如果response.statusCode==404{
打印(“错误Api错误”)
}
//正在获取JSON数据。。
做{
让listings=try JSONDecoder().decode([ListingModel].self,from:jsonData)
DispatchQueue.main.async{
self.listings=列表
self.saveData(contex:context)
}
}
抓住{
打印(错误。本地化描述)
}
}
1.简历()
}
//尝试扩展该函数
func addListingOfAvorites(收藏夹列表:ListingModel){
addRecordToFavourites(FavoriteListing:FavoriteListing.title)
}
func isListingFavorite(FavoriteListing:ListingModel)->Bool{
如果let=fetchRecord(FavoriteListing:FavoriteListing.title){
返回真值
}
返回错误
}
func从收藏夹中删除列表(收藏夹列表:ListingModel){
RemoveRecordfromFavorites(FavoriteListing:FavoriteListing.title)
}
func ToggleFavorite(收藏夹列表:ListingModel){
if IsListingFavorite(FavoriteListing:FavoriteListing){
从收藏夹中移除列表(收藏夹列表:收藏夹列表)
}
否则{
AddListingOfAvorites(FavoriteListing:FavoriteListing)
}
}
}
我还创建了扩展JSONViewModel:
扩展JSONViewModel{
private func addRecordToFavourites(收藏夹列表:字符串){
guard let context=managedContext else{return}
如果let record=fetchRecord(FavoriteListing:FavoriteListing){
打印(“记录\(记录)已存在”)
返回
}
让entity=NSEntityDescription.entity(forEntityName:“收藏夹”,
在:上下文中)!
让收藏夹=NSManagedObject(实体:实体,插入到:上下文)
Favorite.setValue(FavoriteListing,forKeyPath:“FavoriteListing”)
做{
尝试context.save()
}
将let错误捕获为NSError{
打印(“无法保存.\(错误),\(错误.用户信息)”)
}
self.changed=true
}
private func fetchRecord(FavoriteListing:String)->Favorite{
guard let context=managedContext else{return nil}
let request=NSFetchRequest(entityName:“收藏夹”)
request.predicate=NSPredicate(格式:“FavoriteListing==%@”,FavoriteListing)
如果let users=try?context.fetch(请求){
如果users.count>0{
返回用户[0]
}
}
归零
}
私人职能