AsyncStorage 在 react-native-web 上工作,在 ios 上失败(字符串化 json 数据)
AsyncStorage works on react-native-web, fails on ios (stringified json data)
我有一个 web/ios react-native 项目。在网络上这没有任何问题,但在 iOS 上我收到错误。奇怪的是,我在调试window中完全没有看到错误,只好靠红屏了。
我保存数据的方式是这样的:
console.log(`user progress: writing string of >>${JSON.stringify(user.progress)}<< original's type: '${typeof user.progress}'`)
await AsyncStorage.setItem(
appConfig.constants.graphcool.progress,
user.progress
)
那个日志是我在调试器中看到的最后一个日志:
用户进度:写入字符串 >>{"VocabularyPairs":{"1":0.984375,"2":0.996875,"3":0.875}<< 原始类型:'object'
我在 iOS 中遇到错误的红屏:
Exception '-[NSDictionaryM length]: unrecognized selector sent to instance 0x2832c5ce0' was thrown while invoking multiSet on target AsyncLocalStorage with params (
(
(
progress,
{
VocabularyPairs = {
1 = "0.984375";
2 = "0.996875";
3 = "0.875";
};
}
)
),
311
)
所以 -- 我可以通过更改代码来解决此问题:
await AsyncStorage.setItem(
appConfig.constants.graphcool.progress,
Platform.OS === 'ios' ? JSON.stringify(user.progress): user.progress
)
但我的问题是,为什么我必须这样做?如果我确实修复了它,还有另外两个地方也设置了相同的项目——一个已经有了那个包装,另一个没有。 两个地方都有效,而且总是几乎相同数据——数字(即值)可能会改变,但它们在任何地方都是字符串键和数字值。
第一次写有什么特别之处?
如果您使用 AsyncStorage.setItem,值应该是 字符串 。
传递对象而不是字符串应该不起作用!
AsyncStorage.setItem(key: string, value: string, [callback]: ?(error: ?Error) => void)
我有一个 web/ios react-native 项目。在网络上这没有任何问题,但在 iOS 上我收到错误。奇怪的是,我在调试window中完全没有看到错误,只好靠红屏了。
我保存数据的方式是这样的:
console.log(`user progress: writing string of >>${JSON.stringify(user.progress)}<< original's type: '${typeof user.progress}'`)
await AsyncStorage.setItem(
appConfig.constants.graphcool.progress,
user.progress
)
那个日志是我在调试器中看到的最后一个日志:
用户进度:写入字符串 >>{"VocabularyPairs":{"1":0.984375,"2":0.996875,"3":0.875}<< 原始类型:'object'
我在 iOS 中遇到错误的红屏:
Exception '-[NSDictionaryM length]: unrecognized selector sent to instance 0x2832c5ce0' was thrown while invoking multiSet on target AsyncLocalStorage with params (
(
(
progress,
{
VocabularyPairs = {
1 = "0.984375";
2 = "0.996875";
3 = "0.875";
};
}
)
),
311
)
所以 -- 我可以通过更改代码来解决此问题:
await AsyncStorage.setItem(
appConfig.constants.graphcool.progress,
Platform.OS === 'ios' ? JSON.stringify(user.progress): user.progress
)
但我的问题是,为什么我必须这样做?如果我确实修复了它,还有另外两个地方也设置了相同的项目——一个已经有了那个包装,另一个没有。 两个地方都有效,而且总是几乎相同数据——数字(即值)可能会改变,但它们在任何地方都是字符串键和数字值。
第一次写有什么特别之处?
如果您使用 AsyncStorage.setItem,值应该是 字符串 。 传递对象而不是字符串应该不起作用!
AsyncStorage.setItem(key: string, value: string, [callback]: ?(error: ?Error) => void)