2017-02-21 7 views
1

Ich versuche, die NSData von zwischen 20 und 30 UIImages mit einem "for-Schleife" so zu komprimieren und zu erhalten:UIImageJPEGRepresentation unter Verwendung der große Menge an Speichern (Swift 3.0)

for theImage in selectedUIImages { 

let data = UIImageJPEGRepresentation(image,0.5) 
// doing something with the data 

} 

Versuchte auf einem iPhone 7 ohne Probleme neben meiner App bis zu 700 MB Speicher zu verwenden, wenn durch die Schleife zu gehen, aber auf einem älteren iPhone bekomme ich die Meldung:

*Message from debugger: Terminated due to memory issue.* 

Das Hauptziel ist es, die NSData von der UIImage zu bekommen, so kann ich setzen das Bild in einem Verzeichnis zum Hochladen. Lassen Sie mich erklären:

Das Transfer Amazon S3-Dienstprogramm einen Pfad/URL zum Bild will und deshalb brauche ich einen Weg/url für die UIImage und die einzige Art, wie ich zu machen wissen, ist, um es zu bekommen von:

data.write(to: URL(fileURLWithPath: localPath), options: .atomic) 
+0

Haben Sie es im Gerät versucht? – Priyal

+0

Mögliches Duplikat von http://stackoverflow.com/questions/25248294/uiimagejpegrepresentation-received-memory-warning. –

+0

Priyal: Was meinst du? – fayyaz

Antwort

0

Da Ihre App nicht mehr genügend Arbeitsspeicher hat. Sie können es nach der Komprimierung im Document-Verzeichnis speichern und dann einzeln auf den Server hochladen. Es macht also nicht Ihr Speicherproblem.

+0

So wäre es besser, zuerst zu komprimieren und dann hochladen. Also im Grunde 1. eine For-Schleife, die komprimiert und dann eine andere, die aufsteigt? – fayyaz

0

Sie können die Bildgröße verringern, indem Sie einen Verhältnisparameter verringern. Sie können 0,3 anstelle von 0,5 verwenden.

for theImage in selectedUIImages { 

let data = UIImageJPEGRepresentation(image,0.3) 
// doing something with the data 

} 
+0

gleichen Fehler wie zuvor :( * Nachricht vom Debugger: Beendet wegen Speicherproblem. * – fayyaz

+0

@fayyaz Sie erhalten diese Nachricht erhalten, weil Sie keine Kontrolle über die Anzahl der Bilder im Array selectedUIImages. Es kann für eine Nummer arbeiten von Bildern und stürzen auf nur noch ein Bild als das. – NSNoob

0

Versuchen Sie, einen Autofreigabepool mit:

autoreleasepool { 
    for theImage in selectedUIImages { 

     let data = UIImageJPEGRepresentation(image,0.5) 
     // doing something with the data 

    } 
} 

und verschieben Sie sie in einem Hintergrundthread.

+0

wäre es nicht besser, den Autorespulepool innerhalb der Schleife zu haben? – simonWasHere

Verwandte Themen