CameraRoll.saveToCameraRoll 保存多张图像时出现“写忙”错误

Das*_*sto 1 camera-roll react-native

我的 React Native(适用于 iOS)照片应用程序中有一个“全部保存”函数,它可以抓取图像数组并将它们传递给CameraRoll.saveToCameraRoll函数。

这是我保存它们的功能:

saveAllToCameraRoll = () => {
    for (let image of this.state.downloadList) {   
        CameraRoll.saveToCameraRoll(image.uri); 
    }
};
Run Code Online (Sandbox Code Playgroud)

downloadList 是引用存储在 Firebase 存储中的图像的 Firebase 对象数组:

[
    -uid1234 : {
        uri: "https://firebasestorage.googleapis.com/....",
        uploadUser: {
            ....
        }
    },
    ....
]
Run Code Online (Sandbox Code Playgroud)

这一切似乎都有效,并且适用于单个/少数图像,但是如果 downloadList 变得太大(似乎是 11 个图像),它会开始发出警告并且某些图像将无法保存。警告是:

可能未处理的承诺拒绝错误:写忙

并且:

保存裁剪图像时出错:错误域=ALAssetsLibraryErrorDomainCode=-3301“写忙”

看起来很简单,你不能这么快地保存这么多,否则它会冻结,但我找不到关于如何等待它完成一个来开始下一个的文档。

riw*_*iwu 5

CameraRoll.saveToCameraRoll返回一个Promise,所以你可以等待它完成:

saveAllToCameraRoll = async () => {
    for (let image of this.state.downloadList) {   
        await CameraRoll.saveToCameraRoll(image.uri); 
    }
};
Run Code Online (Sandbox Code Playgroud)

或者使用Airbnb推荐的方式

this.state.downloadList.reduce((prev, { uri }) =>
  prev.then(() => CameraRoll.saveToCameraRoll(uri), Promise.resolve()));
Run Code Online (Sandbox Code Playgroud)

如果你仍然想并行执行一些操作,你可以迭代一个步骤,并在每次迭代中用Promise.all包装这些操作。