Sto utilizzando una libreria di selezione immagini per consentire all'utente di selezionare molte immagini dalla sua libreria di foto. Vengono restituiti come una serie di PHAssets
. Quindi, voglio convertire tutti gli PHAssets
in UIImages
e scriverli nella memoria dell'app.Utilizzo memoria elevato che passa attraverso PHAssets e richiesta di chiamataImageForAsset
Al momento, sto collegando tutte le risorse e chiamando lo requestImageForAsset
in modo sincrono. Il mio problema è che c'è un picco di utilizzo della memoria incredibilmente alto quando viene eseguito questo ciclo (con 30 immagini, raggiunge i 130 MB). Vorrei impedire questo.
Ecco il mio codice:
for(PHAsset *asset in self.assets) {
NSLog(@"started requesting image %i", i);
[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFit options:[self imageRequestOptions] resultHandler:^(UIImage *image, NSDictionary *info) {
dispatch_async(dispatch_get_main_queue(), ^{
assetCount++;
NSError *error = [info objectForKey:PHImageErrorKey];
if (error) NSLog(@"Image request error: %@",error);
else {
NSString *imagePath = [appDelegate.docsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%i.png",i]];
NSData *imageData = UIImagePNGRepresentation(image);
if(imageData) {
[imageData writeToFile:imagePath atomically:YES];
[self.imagesArray addObject:imagePath];
}
else {
NSLog(@"Couldn't write image data to file.");
}
[self checkAddComplete];
NSLog(@"finished requesting image %i", i);
}
});
}];
i++;
}
Sulla base dei tronchi, vedo che tutti i "immagine di partenza chiedendo x" sono chiamati in primo luogo, poi tutti i blocchi di completamento ("finito richiedendo immagine x"). Penso che questo potrebbe contribuire al problema della memoria. Probabilmente richiederebbe meno memoria per garantire che il blocco di completamento per ogni iterazione venga chiamato prima di liberare tali risorse e passare alla successiva iterazione. Come posso fare questo?
Grazie.Ho provato @autoreleasepool nel ciclo for, ma inserendolo in entrambi e il gestore del risultato ha fatto il trucco! – Charles
Questo trucco non funziona per me. : -s –