Ich benutze NSOperation, um das Bild jeder Zelle herunterzuladen, so dass ich den Benutzer nicht mit starkem Bildladen überlasten muss. Das funktioniert 99% der Zeit, aber von Zeit zu Zeit bekomme ich eine Null in meinem Block und den App-Crash.NSOperation zum Laden eines Bildes in eine Zelle - Absturz
Dies ist der Code:
cell.blockImage.image = nil
cell.queue.cancelAllOperations()
let cacheKey = indexPath.row
if(self.imagesDictionary.object(forKey: cacheKey) != nil)
{
cell.blockImage.image = self.imagesDictionary.object(forKey: cacheKey) as? UIImage
}
else
{
let operation: BlockOperation = BlockOperation()
operation.addExecutionBlock({
if let url = NSURL(string: self.arrJSONData[indexPath.row].image) {
if let data = NSData(contentsOf: url as URL) {
if let image: UIImage = UIImage(data: data as Data)
{
self.imagesDictionary.setObject(image, forKey: cacheKey as NSCopying)
DispatchQueue.main.async(execute: {
if(operation.isCancelled)
{
return
}
cell.blockImage.image = image
})
}
}
}
})
cell.queue.addOperation(operation)
}
So downloaden i de Bild und speichert sie in einem Wörterbuch. Der Schlüssel ist der indexPath.row der Zelle.
Ich überprüfe auch, ob das Bild bereits im Wörterbuch ist, also lade ich es nicht noch einmal herunter.
Und ich setze immer mein Bild auf Null und annulliere die BlockOperation, wenn ich anfange, die Zelle zu laden.
Der Fehler, den ich immer bekommen, ist dies:
malloc: *** error for object 0x608000244c50: Invalid pointer dequeued from free list
*** set a breakpoint in malloc_error_break to debug
und ich habe es immer in diesem Block erhalten (aber die Linie ist immer zufällig)
if let image: UIImage = UIImage(data: data as Data)
{
self.imagesDictionary.setObject(image, forKey: cacheKey as NSCopying)
DispatchQueue.main.async(execute: {
if(operation.isCancelled)
{
return
}
cell.blockImage.image = image
})
}
Was mache ich falsch? Vielen Dank.
Ich weiß nicht, warum Sie abstürzen, aber Sie sollten mit so etwas wie https://github.com/Alamofire/AlamofireImage betrachten – EricD
Ich bin kein Fan von externen Bibliotheken, aber ich sollte diese Bibliothek studieren, was tut. Vielen Dank! – Gusfat