gpt4 book ai didi

ios - 减少日期核心分配的内存消耗

转载 作者:行者123 更新时间:2023-11-28 16:05:08 26 4
gpt4 key购买 nike

我有一个很大的困难是一个星期。我得到一个包含许多对象的 JSON,每个对象最多可以有 8 张照片。我正在对 15,000 个对象进行测试,我的内存消耗始终保持不变,直到收到错误 “Malloc 错误“无法分配区域”失败,错误代码 3”

我该如何解决这个问题?我试图重置我的核心对象日期的上下文,但还没有决定。

下面是我的部分代码:

for item in products {
i = i + 1
print(i)

let p = item as! NSDictionary
let product = NSEntityDescription.insertNewObjectForEntityForName("PRODUCT", inManagedObjectContext: self.context) as! PRODUCT

if tipo != "FULL"{
let chave = p["Chave"] as! String
if self.loadProductWithKey(chave).count > 0 {
self.deleteProductWithKey(chave)
}
}

product.chave = p["Chave"] as? String
product.chaveFabricante = p["ChaveFabricante"] as? String
product.chaveMarca = p["ChaveMarca"] as? String
product.chaveUnidade = p["ChaveUnidade"] as? String
product.chaveGrupo = p["ChaveGrupo"] as? String
product.codigo = p["Codigo"] as? String
product.codigoSegundario = p["CodigoSecundario"] as? String
product.descricaoNF = p["DescricaoNf"] as? String
product.descricaoDetalhada = p["DescricaoDetalhada"] as? String
product.chaveLicenca = p["ChaveLicenca"] as? String


var image = UIImage()
var url = NSURL()
var code = ""
var chave = ""
var fileName = ""

let photo1Url = p["UrlFoto1"] as! String
if photo1Url != ""{
url = NSURL(string: "\(_URLPREFIX)\(photo1Url)")!
if let foto = NSData(contentsOfURL: url) {
if foto.length > 0{
image = UIImage(data: foto)!
code = p["Codigo"] as! String
chave = p["Chave"] as! String
let documents = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false)
fileName = "picture-\(chave)-\(code)-1.jpg"
let fileURL = documents.URLByAppendingPathComponent(fileName)
if let jpgImageData = UIImageJPEGRepresentation(image, 0.8) {
jpgImageData.writeToURL(fileURL, atomically: true)
}
product.urlFoto1 = fileName
}
}
}

let photo2Url = p["UrlFoto2"] as! String
if photo2Url != ""{
url = NSURL(string: "\(_URLPREFIX)\(photo2Url)")!
if let foto = NSData(contentsOfURL: url) {
if foto.length > 0{
image = UIImage(data: foto)!
code = p["Codigo"] as! String
chave = p["Chave"] as! String
let documents = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false)
fileName = "picture-\(chave)-\(code)-2.jpg"
let fileURL = documents.URLByAppendingPathComponent(fileName)
if let jpgImageData = UIImageJPEGRepresentation(image, 0.8) {
jpgImageData.writeToURL(fileURL, atomically: true)
}
product.urlFoto2 = fileName
}
}
}

let photo3Url = p["UrlFoto3"] as! String
if photo3Url != ""{
url = NSURL(string: "\(_URLPREFIX)\(photo3Url)")!
if let foto = NSData(contentsOfURL: url) {
if foto.length > 0{
image = UIImage(data: foto)!
code = p["Codigo"] as! String
chave = p["Chave"] as! String
let documents = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false)
fileName = "picture-\(chave)-\(code)-3.jpg"
let fileURL = documents.URLByAppendingPathComponent(fileName)
if let jpgImageData = UIImageJPEGRepresentation(image, 0.8) {
jpgImageData.writeToURL(fileURL, atomically: true)
}
product.urlFoto3 = fileName
}
}
}

let photo4Url = p["UrlFoto4"] as! String
if photo4Url != ""{
url = NSURL(string: "\(_URLPREFIX)\(photo4Url)")!
if let foto = NSData(contentsOfURL: url) {
if foto.length > 0{
image = UIImage(data: foto)!
code = p["Codigo"] as! String
chave = p["Chave"] as! String
let documents = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false)
fileName = "picture-\(chave)-\(code)-4.jpg"
let fileURL = documents.URLByAppendingPathComponent(fileName)
if let jpgImageData = UIImageJPEGRepresentation(image, 0.8) {
jpgImageData.writeToURL(fileURL, atomically: true)
}
product.urlFoto4 = fileName
}
}
}

let photo5Url = p["UrlFoto5"] as! String
if photo5Url != ""{
url = NSURL(string: "\(_URLPREFIX)\(photo5Url)")!
if let foto = NSData(contentsOfURL: url) {
if foto.length > 0{
image = UIImage(data: foto)!
code = p["Codigo"] as! String
chave = p["Chave"] as! String
let documents = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false)
fileName = "picture-\(chave)-\(code)-5.jpg"
let fileURL = documents.URLByAppendingPathComponent(fileName)
if let jpgImageData = UIImageJPEGRepresentation(image, 0.8) {
jpgImageData.writeToURL(fileURL, atomically: true)
}
product.urlFoto5 = fileName
}
}
}

do {
try self.context.save()
} catch {
print("============ erro nos produtos")

}
self.context.refreshAllObjects()
}

最佳答案

您的代码有很多问题。

您不应使用 NSData(contentsOfURL:) 从远程站点加载数据。它卡住了主线程。而是使用 NSURLSession。您可以创建一个下载任务,将您的图像数据直接下载到文件中。它将异步执行,不会阻塞主线程。

你也不应该在没有采取措施避免内存不足的情况下在循环中加载大量大对象。将加载大型对象的循环内的部分包含在 autoreleasepool block 中:

for (i, item) in products.enumerate() {
autoreleasepool {
//Put the body of your for loop here
}
}

autoreleasepool{} block 告诉编译器,它应该在每次退出大括号时释放在大括号内分配的临时(或自动释放)对象。 (这被称为“耗尽自动释放池”)

通过将 autoreleasepool{} block 放在您的 for 循环中,您可以释放您的代码在每次通过循环时创建的自动释放对象。

但是,如果您使用 NSURLSession 和下载任务,您就不必担心这个问题。系统会自动下载文件并保存,并为您管理进程内存。

关于ios - 减少日期核心分配的内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40401254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com