SwiftUI 领域内存问题。 RAM 使用量不断增加

SwiftUI Realm Memory issue. RAM usage keeps on increasing

我正在下载 7000 多张需要保存到 Realm DB 的图像。我正在以 100 个为一组写入数据库。它们暂时存储在一个数组中。

我的问题是,随着进程的进行,RAM 使用量不断增加。我已经用 autoreleasepool { activity } 包装了 activity,但它一直在发生。

func downloadImages() {
    autoreleasepool {
        realmQueue.async {
            let realm = try! Realm()
            print("6.5: Downloading Images")
            var x = 0

            var imageSavedArray : [ImageSaved] = []

            let imageUrls = self.urlPrep()

            for url1 in imageUrls {

                let imageURL = URL(string: url1)
                let placeholder = URL(string: "")
                let imageToSave = ImageSaved()
                if imageURL != nil {
                   
                    let data = try? Data(contentsOf: imageURL)
                   
                    imageToSave.link = url1
                    imageToSave.data = data
                    
                    imageSavedArray.append(imageToSave)
                    
                }  else {
                    print("Invalid Saving Process for " + url1)
                }

                if ((x % 100) == 0) {
                    try! realm.write {
                       
                        realm.add(imageSavedArray)
                    }
                    imageSavedArray = []
                }
                x += 1
            }//end for
        }//end queue
    } //end autoreleasepool
} //end function

[这将一直持续到最终崩溃。][1]

进程一完成,RAM 就会返回 normal.As 你可以看到,我在将数组写入 Realm 后重置数组。

如有任何帮助,我们将不胜感激。

为了简短起见,让我使用通用代码提供一个答案,并忽略此答案的 .async。

此外,此代码假定数组中的 url 数量是 10 的倍数以保持简短。

for i in stride(from: 0, to: urlArray.count, by: 10) {
    autoreleasepool(invoking: {
        let smallUrlArray = myArray[i...i+9] //get 10 urls, start to fill pool
        var imageSavedArray = [ImageSaved]()
        for imageUrl in smallUrlArray {
            let imageToSave = ...create an ImageSaved object from the image and data
            imageSavedArray.append(imageToSave)
        }
        try! realm.write {
           realm.add(imageSavedArray)
        }
    }) //drain pool
}

在代码中,使用 stride

每 10 个索引迭代一次 url 数组

在那个外部循环中,创建一个自动释放池

在池中创建一个包含 10 个 url 的数组,然后迭代 - 在该循环中,创建要保存的领域对象,存储在 imageSavedArray 中,然后将它们写入领域。

在关闭结束时,池被清空,这意味着在自动释放池中创建的任何内容都将被处理掉,内存也会被释放。

所以内存配置文件看起来像这样

       /|    /|
      / |   / |
     /  |  /  |
fill^   ^drain