CameraRoll.saveToCameraRoll "Write Busy" 保存多张图片时出错
CameraRoll.saveToCameraRoll "Write Busy" error when saving multiple images
我的 React Native(针对 iOS)照片应用程序中有一个 "save all" 函数,它抓取图像数组并将它们传递给 CameraRoll.saveToCameraRoll
函数。
这是我保存它们的功能:
saveAllToCameraRoll = () => {
for (let image of this.state.downloadList) {
CameraRoll.saveToCameraRoll(image.uri);
}
};
downloadList
是引用存储在 Firebase 存储中的图像的 Firebase 对象数组:
[
-uid1234 : {
uri: "https://firebasestorage.googleapis.com/....",
uploadUser: {
....
}
},
....
]
这一切似乎都有效,并且对 single/few 图像工作正常,但如果 downloadList 变得太大(似乎有 11 张图像),它会开始发出警告并且一些图像不会被保存。警告是:
Possible Unhandled Promise Rejection Error: Write Busy
还有:
Error saving cropped image: Error Domain=ALAssetsLibraryErrorDomainCode=-3301 "Write Busy"
这看起来很简单,你不能这么快保存这么多,否则它会冻结,但我找不到关于如何等待它完成一个以开始下一个的文档。
CameraRoll.saveToCameraRoll
returns 一个 Promise,所以你可以等待它完成:
saveAllToCameraRoll = async () => {
for (let image of this.state.downloadList) {
await CameraRoll.saveToCameraRoll(image.uri);
}
};
this.state.downloadList.reduce((prev, { uri }) =>
prev.then(() => CameraRoll.saveToCameraRoll(uri), Promise.resolve()));
如果您仍想并行执行一些操作,您可以使用一个步骤进行迭代,并在每个迭代中使用 Promise.all 包装操作。
我的 React Native(针对 iOS)照片应用程序中有一个 "save all" 函数,它抓取图像数组并将它们传递给 CameraRoll.saveToCameraRoll
函数。
这是我保存它们的功能:
saveAllToCameraRoll = () => {
for (let image of this.state.downloadList) {
CameraRoll.saveToCameraRoll(image.uri);
}
};
downloadList
是引用存储在 Firebase 存储中的图像的 Firebase 对象数组:
[
-uid1234 : {
uri: "https://firebasestorage.googleapis.com/....",
uploadUser: {
....
}
},
....
]
这一切似乎都有效,并且对 single/few 图像工作正常,但如果 downloadList 变得太大(似乎有 11 张图像),它会开始发出警告并且一些图像不会被保存。警告是:
Possible Unhandled Promise Rejection Error: Write Busy
还有:
Error saving cropped image: Error Domain=ALAssetsLibraryErrorDomainCode=-3301 "Write Busy"
这看起来很简单,你不能这么快保存这么多,否则它会冻结,但我找不到关于如何等待它完成一个以开始下一个的文档。
CameraRoll.saveToCameraRoll
returns 一个 Promise,所以你可以等待它完成:
saveAllToCameraRoll = async () => {
for (let image of this.state.downloadList) {
await CameraRoll.saveToCameraRoll(image.uri);
}
};
this.state.downloadList.reduce((prev, { uri }) =>
prev.then(() => CameraRoll.saveToCameraRoll(uri), Promise.resolve()));
如果您仍想并行执行一些操作,您可以使用一个步骤进行迭代,并在每个迭代中使用 Promise.all 包装操作。