首页 > 解决方案 > 保存多个图像时,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"

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

标签: react-nativecamera-roll

解决方案


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将操作包装在每次迭代中。


推荐阅读