我有一个数组,用于存储已编码的自定义类,以便将其保存到NSUserDefaults。它基于tableView单元格,带有收藏夹按钮,每次按下收藏夹按钮,保存到本地阵列,然后保存到NSUserDefaults。问题是如果多次按下收藏夹按钮,该tableView单元格的多个副本将保存到NSUserDefaults。这是我保存数据的代码。我试着检查一下" savedFavorite"已经存在于数组中,但由于它每次都被编码为不同的编码值,所以它看起来不像重复:
let myDefaults = NSUserDefaults.standardUserDefaults()
let savedShow1 = "savedShow1"
var savedFavorite: TvShowInfo!
var savedFavoriteArray:[TvShowInfo] = []
@IBAction func saveShow(sender: UIButton) {
//accessing current point of tableView Cell
let location: CGPoint = sender.convertPoint(CGPointZero, toView: self.tvShowTableView)
let indexPath: NSIndexPath = self.tvShowTableView.indexPathForRowAtPoint(location)!
let searchTermsData = myDefaults.objectForKey(savedShow1) as? NSData
//accessing previously saved info so as not to overwrite it
if searchTermsData?.length > 0 {
let searchTermsArray = NSKeyedUnarchiver.unarchiveObjectWithData(searchTermsData!) as? [TvShowInfo]
self.savedFavoriteArray = searchTermsArray!
}
if searchBarActive {
savedFavorite = filteredShowSearchResults[indexPath.row]
} else {
savedFavorite = showArray[indexPath.row]
}
if savedFavoriteArray.contains(savedFavorite) {
print("Item already in array")
} else {
savedFavoriteArray.append(savedFavorite)
}
let savedData = NSKeyedArchiver.archivedDataWithRootObject(savedFavoriteArray)
myDefaults.setObject(savedData, forKey: savedShow1)
myDefaults.synchronize()
}
这是我的自定义类:
class TvShowInfo: NSObject, NSCoding {
var poster: String
var title: String
var id: NSNumber
init(poster: String, title: String, id: NSNumber) {
self.poster = poster
self.title = title
self.id = id
}
// MARK: - comply wiht NSCoding protocol
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(poster, forKey: "poster")
aCoder.encodeObject(title, forKey: "title")
aCoder.encodeObject(id, forKey: "id")
}
required convenience init?(coder aDecoder: NSCoder) {
// decoding could fail, for example when no Blog was saved before calling decode
guard let unarchivedPoster = aDecoder.decodeObjectForKey("poster") as? String,
let unarchivedTitle = aDecoder.decodeObjectForKey("title") as? String,
let unarchivedId = aDecoder.decodeObjectForKey("id") as? NSNumber
else {
// option 1 : return an default Blog
self.init(poster: "unkown", title:"unkown", id: 0)
return
}
// convenience init must call the designated init
self.init(poster: unarchivedPoster, title: unarchivedTitle, id: unarchivedId)
}
}
答案 0 :(得分:0)
您也可以将数组转换为set(NSSet),并且您的数组将立即免于重复。请参阅此帖子:Set operations (union, intersection) on Swift array?