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
我正在下载 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 的数组,然后迭代 - 在该循环中,创建要保存的领域对象,存储在 imageSavedArray 中,然后将它们写入领域。
在关闭结束时,池被清空,这意味着在自动释放池中创建的任何内容都将被处理掉,内存也会被释放。
所以内存配置文件看起来像这样
/| /|
/ | / |
/ | / |
fill^ ^drain