2015-03-02 15 views
5

Sto provando a caricare tutte le immagini dall'album fotografico dell'utente nella Vista raccolta della mia app, ma dopo aver caricato alcune delle immagini loro, l'app si chiuderà e tornerà al menu principale. Anche la connessione con XCode è disconnessa. Questo non accade nel simulatore ma solo nell'iPhone 4s con cui sto testando. I messaggi di errore che compaiono prima che si schianti è, in ordine cronologico,Caricamento di immagini da Foto a collezione visualizza risultati con messaggio di errore "Connessione a assetsd interrotta o asset persi"

  1. memoria Ricevuto avvertimento
  2. Collegamento a assetsd è stato interrotto o assetsd morti.

Ho raccolto diverse parti del codice che credo causino questo problema.

var imgFetchResult: PHFetchResult! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    let fetchOptions = PHFetchOptions() 
    fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)] 

    let fetchResult = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: fetchOptions) 

    if fetchResult.count > 0 
    { 
     println("images found ? \(fetchResult.count)") 
     self.imgFetchResult = fetchResult 
    } 
} 

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
{ 
    println("cellForItemAtIndexPath") 
    let cell: PhotoThumbnailCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as PhotoThumbnailCollectionViewCell 

    println("indexpath is \(indexPath.item)") 

    if(indexPath.item == 0) 
    { 
     cell.backgroundColor = UIColor.redColor() //temp placeholder for camera image 
    } 
    else 
    { 
     let asset: PHAsset = self.imgFetchResult[indexPath.item] as PHAsset 
     PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: PHImageManagerMaximumSize, contentMode: .AspectFill, options: nil, resultHandler: {(result, info) in cell.setThumbnailImage(result) 
     }) 
    } 

    return cell 
} 

Credo che ho bisogno di liberare la memoria, ma non so cosa. Sembra essere le immagini che vengono caricate nelle celle della vista di raccolta.

Ho anche scoperto che la vista di raccolta non va oltre le 4 immagini. Dopo la quarta immagine, si verifica l'arresto. Inoltre, le immagini non sono caricate in ordine.

risposta

8

Il problema è stato trovato in questa linea di codice

PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: PHImageManagerMaximumSize, contentMode: .AspectFill, options: nil, resultHandler: {(result, info) in cell.setThumbnailImage(result) 
}) 

Il parametro, targetSize stato passato il valore di PHImageManagerMaximumSize che era il colpevole. L'ho modificato in CGSize(width: 105, height: 105) risolto il problema.

Secondo la documentazione PHImageManagerMaximumSize

Quando si utilizza l'opzione PHImageManagerMaximumSize, foto fornisce la più grande immagine a disposizione per il bene senza ridimensionamento e il ritaglio. (ovvero ignora l'opzione resizeMode)

Quindi, questo spiega il problema. Credo che se fosse una singola immagine, non dovrebbe essere un problema, ma se fossero molte immagini, il dispositivo avrebbe esaurito la memoria.

Spero che questo aiuti le altre persone.

+1

Quello che è sorprendente per favore dimmi che taglia devo dare? come hai detto ho dato 105 e 105 ma l'immagine non è chiara, quali valori devo passare per visualizzare l'immagine con la qualità –

+0

Puoi fare: let targetSize = CGSize (larghezza: asset.pixelWidth/2, altezza: asset. pixelHeight/2) – jamesthakid

0

Come ha detto @winhung, per me era anche la dimensione. Quello che ho fatto è stato di ridurre la dimensione obiettivo della metà, ad esempio:

let asset: PHAsset = self.imgFetchResult[indexPath.item] as PHAsset 
let mytargetSize = CGSize(width: asset.pixelWidth/2, height: asset.pixelHeight/2) 

PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: mytargetSize, contentMode: .AspectFill, options: nil, resultHandler: {(result, info) in cell.setThumbnailImage(result) 
})