react-native - 保存多个图像时,CameraRoll.saveToCameraRoll“写忙”错误
问题描述
我的 React Native(适用于 iOS)照片应用程序中有一个“全部保存”功能,它可以抓取图像数组并将它们传递给该CameraRoll.saveToCameraRoll
功能。
这是我保存它们的功能:
saveAllToCameraRoll = () => {
for (let image of this.state.downloadList) {
CameraRoll.saveToCameraRoll(image.uri);
}
};
downloadList
是一个 Firebase 对象数组,引用存储在 Firebase 存储中的图像:
[
-uid1234 : {
uri: "https://firebasestorage.googleapis.com/....",
uploadUser: {
....
}
},
....
]
这一切似乎都有效,并且适用于单个/少数图像,但如果 downloadList 变得太大(看似 11 个图像),它会开始引发警告并且某些图像不会被保存。警告是:
可能的未处理的 Promise Rejection 错误:Write Busy
并且:
保存裁剪图像时出错:Error Domain=ALAssetsLibraryErrorDomainCode=-3301 "Write Busy"
看起来很简单,你不能这么快保存这么多,或者它会冻结,但我找不到关于如何等待它完成一个来开始下一个的文档。
解决方案
CameraRoll.saveToCameraRoll
返回一个Promise,因此您可以等待它完成:
saveAllToCameraRoll = async () => {
for (let image of this.state.downloadList) {
await CameraRoll.saveToCameraRoll(image.uri);
}
};
或者使用Airbnb 推荐的方式:
this.state.downloadList.reduce((prev, { uri }) =>
prev.then(() => CameraRoll.saveToCameraRoll(uri), Promise.resolve()));
如果您仍想并行执行一些操作,您可以使用一个步骤进行迭代,并使用Promise.all将操作包装在每次迭代中。
推荐阅读
- python - python:使用临时文件作为管道
- java - Intellij 创建具有令人兴奋的 sqlite 依赖项的 .jar 文件失败
- regex - 正则表达式仅在适当的位置匹配带有关键字的多行字符串
- reactjs - 每次调用 mapStateToProps 时,与Router 反应都会为匹配创建一个新对象
- r - 在 R 年问题中绘制条形图
- java - scala-java.lang.NoClassDefFoundError
- c - strcmp 在迭代服务器 C 中不起作用
- r - t 检验的“数据基本不变”错误
- sorting - 如何根据最高分组对对象列表进行排序?
- tensorflow - 让keras LSTM层接受两个输入?