将用户模型保存在UserDefaults中,并将存储的用户追加到数组中

时间:2019-01-22 11:51:45

标签: ios arrays swift nsuserdefaults

我有一个这样声明的用户模型:

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数组?

3 个答案:

答案 0 :(得分:0)

如果使用Codable,则可以使用JSONEncoderJSONDecoder并将用户存储为数组

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中,则需要执行以下操作:

  1. 为您的项目安装Realm。

    • 在您的podfile中添加以下内容:pod 'RealmSwift'

    • 在终端中运行pod install,从现在开始使用新创建的.xcworkspace

  2. 在Xcode中,在AppDelegate中,导入RealmSwift并将以下代码插入到didFinishLaunchingWithOptions方法中:

        do {
        _ = try Realm()
    } catch {
        print("Error initialising new Realm \(error)")
    }
    

这将初始化一个新的默认领域,将在其中存储您的用户数据。

  1. 创建一个新的User.swift文件。在此,导入RealmSwift并插入以下内容:

    class User: Object { @objc dynamic var nickName: String = "" @objc dynamic var fullName: String = "" @objc dynamic var profilePicURL: URL? }

这将创建一个Realm对象,其中将包含您用户的数据。

  1. 像这样保存关注的用户:

    • 在您要保存用户数据导入的RealmSwift的视图控制器中,并在类声明下通过let realm = try! Realm()

    • 创建一个新的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)")
    }
  1. 在需要用户数据的视图控制器中,就像之前使用let realm = try! Realm()创建Realm的实例一样 ,使用以下代码从Realm检索用户:let followedUsers = realm.objects(User.self) 这将从默认领域检索所有用户。 如果您需要计算followedUsers的数量,可以这样:followedUsers.count

希望这种方法可以帮助您首先实现想要的目标。

答案 2 :(得分:-1)

请制作array中的object,然后将数组存储在userDefaults中。

之后,您可以轻松地检索它。

这可能会对您有所帮助。谢谢。