NSUerDefault setValue 和setObject

NSUserDefault setValue与setObject区别
本文讨论了在iOS开发中使用NSUserDefault时setValue与setObject的区别。当使用setValue将值设为nil时,可能会导致对应键值被删除的问题,尤其是在较老的iOS版本中更为常见。因此建议开发者在设置nil值时采用setObject方法以避免意外的数据丢失。

这两种都是可以的,但是 如果你在某个地方对同一个key
setValue:nil for:Key 那就会把 NSUserDefault中的这个key给清除掉,(比较老的版本会出现概率大),所以尽量 用setObject 比较保险

在ViewModel中,`postValue()` `setValue()` 是 `MutableLiveData` 类的两个重要方法,主要用于更新 `LiveData` 所持有的值,二者存在以下区别: ### 线程安全性 - **`setValue()`**:该方法只能在主线程中调用。如果在子线程中调用 `setValue()`,会抛出异常。因为 `LiveData` 设计为在主线程中更新通知观察者,以确保UI更新操作的线程安全。 ```kotlin // 在主线程中使用 setValue() val liveData = MutableLiveData<String>() liveData.setValue("New Value") ``` - **`postValue()`**:该方法可在任何线程中调用。当在子线程中调用 `postValue()` 时,它会将值发布到主线程,然后在主线程中更新 `LiveData` 的值并通知观察者。如果在调用 `postValue()` 之后又在主线程中调用了 `setValue()` 或者再次调用 `postValue()`,那么只有最后一次的值会被处理。 ```kotlin // 在子线程中使用 postValue() GlobalScope.launch(Dispatchers.IO) { val liveData = MutableLiveData<String>() liveData.postValue("Value from background thread") } ``` ### 执行时机 - **`setValue()`**:调用 `setValue()` 后,`LiveData` 会立即更新其值,并马上通知所有活跃的观察者。 - **`postValue()`**:调用 `postValue()` 时,它会将更新操作放入到主线程的消息队列中。这意味着值的更新观察者的通知不是立即执行的,而是在主线程处理到该消息时才会进行。如果在短时间内多次调用 `postValue()`,只有最后一次的值会被实际处理,前面的值会被覆盖。 ### 应用场景 - **`setValue()`**:适用于已经在主线程中执行的操作,例如处理用户的点击事件,这些事件本身就是在主线程中触发的,此时可以直接使用 `setValue()` 来更新 `LiveData` 的值。 - **`postValue()`**:常用于异步操作,比如网络请求、数据库查询等,这些操作通常在子线程中执行。在子线程中获取到数据后,可以使用 `postValue()` 将数据更新到 `LiveData` 中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值