我有一个这样声明的用户模型:
struct User: Codable {
let nickname : String
let fullName: String
let profilePicUrl: URL
}
然后我这样保存关注的用户
let followedUser = User(nickname: username, fullName: fullName, profilePicUrl: url)
UserDefaults.standard.set(try! PropertyListEncoder().encode(followedUser), forKey: "user")
接下来,在应该显示跟随用户计数的ViewController中,我像这样检索UserDefaults数据
var followedUsers = [User]()
if let storedObject: Data = UserDefaults.standard.object(forKey: "user") as? Data {
do {
let storedUser: User = try PropertyListDecoder().decode(User.self, from: storedObject)
followedUsers.append(storedUser)
} catch {
print(error)
}
}
现在,我的followedUsers数组每次都用最近存储的用户进行更新。如何以适当的方式附加我的followedUsers数组?
答案 0 :(得分:0)
如果使用Codable
,则可以使用JSONEncoder
和JSONDecoder
并将用户存储为数组
do {
// How to save multiple records
var followers = [User]() // Your array of users
let data = try JSONEncoder().encode(followers) //Convert to Data
UserDefaults.standard.set(data, forKey: "data") // Save to User Default
// How to fetch multiple records
// Check If data available in user default
if let da = UserDefaults.standard.data(forKey: "data") {
// Convert Data back to your cod-able struct
let stored = try JSONDecoder().decode([User].self, from: da)
}
}
catch {
print(error)
}
struct User: Codable {
let nickname , fullName: String
let profilePicUrl: URL
}
不鼓励使用userDefault,您可以使用 CoreData / Realm
答案 1 :(得分:0)
正如@Sateesh和@Sanjukta所说,将用户存储在数组中并将其保存到UserDefaults是一种解决方案。
仅用一个用户更新followedUsers数组的原因是,当您创建一个新用户时,您每次都更新UserDefaults中的相同键。
应注意,UserDefaults主要用于存储少量数据。根据计划存储的User对象数量,UserDefaults可能不是最佳解决方案。
想到的两种数据存储解决方案是Core Data和Realm。核心数据是一个Apple框架,您可以使用它在设备上存储数据。您可以在这里了解更多信息:Core Data
第二个选项是使用Realm。 Realm是一个开源数据库管理系统,也可以用于设备上的数据存储。
如果您对Realm和Core Data之间的差异感兴趣,那么对于初学者,我可以推荐this文章。
我个人在自己的项目中使用Realm,因为我发现它比Core Data更容易实现和更快。请注意,这只是我的个人喜好,其他人可能会不同意。在选择双方之前,请确保您听取其他意见并进行尝试。
因此,假设您要将用户存储在Realm中,则需要执行以下操作:
为您的项目安装Realm。
在您的podfile中添加以下内容:pod 'RealmSwift'
。
在终端中运行pod install
,从现在开始使用新创建的.xcworkspace
。
在Xcode中,在AppDelegate中,导入RealmSwift并将以下代码插入到didFinishLaunchingWithOptions方法中:
do {
_ = try Realm()
} catch {
print("Error initialising new Realm \(error)")
}
这将初始化一个新的默认领域,将在其中存储您的用户数据。
创建一个新的User.swift文件。在此,导入RealmSwift并插入以下内容:
class User: Object {
@objc dynamic var nickName: String = ""
@objc dynamic var fullName: String = ""
@objc dynamic var profilePicURL: URL?
}
这将创建一个Realm对象,其中将包含您用户的数据。
像这样保存关注的用户:
在您要保存用户数据导入的RealmSwift的视图控制器中,并在类声明下通过let realm = try! Realm()
拥有用户数据后,使用以下代码保存到Realm:
:
let followedUser = User()
do{
try realm.write {
followedUser.nickName = username
followedUser.fullName = fullName
followedUser.profilePicURL = url
realm.add(followedUser)
}
} catch {
print("Error saving to persistent container! \(error)")
}
let realm = try! Realm()
创建Realm的实例一样
,使用以下代码从Realm检索用户:let followedUsers = realm.objects(User.self)
这将从默认领域检索所有用户。
如果您需要计算followedUsers的数量,可以这样:followedUsers.count
希望这种方法可以帮助您首先实现想要的目标。
答案 2 :(得分:-1)
请制作array
中的object
,然后将数组存储在userDefaults
中。
之后,您可以轻松地检索它。
这可能会对您有所帮助。谢谢。