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); 
    }
};

Airbnb's recommended way:

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

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