iOS 8, de Charger des Images Rapide De PHAsset
J'ai une application qui permet aux gens de combiner jusqu'à 4 photos. Cependant, quand je les laisse choisir à partir de leurs photos (jusqu'à 4), il peut être très lente, même lorsque j'ai mis la qualité de l'image à FastFormat. Il va prendre 4 secondes (environ 1 seconde par photo). Sur la plus haute qualité, 4 images prend 6 secondes.
Pouvez-vous suggérer de toute façon je obtenir les images plus vite?
Ici est le bloc où je traite les images.
func processImages()
{
_selectediImages = Array()
_cacheImageComplete = 0
for asset in _selectedAssets
{
var options:PHImageRequestOptions = PHImageRequestOptions()
options.synchronous = true
options.deliveryMode = PHImageRequestOptionsDeliveryMode.FastFormat
PHImageManager.defaultManager().requestImageForAsset(asset, targetSize:CGSizeMake(CGFloat(asset.pixelWidth), CGFloat(asset.pixelHeight)), contentMode: .AspectFit, options: options)
{
result, info in
var minRatio:CGFloat = 1
//Reduce file size so take 1/3 the screen w&h
if(CGFloat(asset.pixelWidth) > UIScreen.mainScreen().bounds.width/2 || CGFloat(asset.pixelHeight) > UIScreen.mainScreen().bounds.height/2)
{
minRatio = min((UIScreen.mainScreen().bounds.width/2)/(CGFloat(asset.pixelWidth)), ((UIScreen.mainScreen().bounds.height/2)/CGFloat(asset.pixelHeight)))
}
var size:CGSize = CGSizeMake((CGFloat(asset.pixelWidth)*minRatio),(CGFloat(asset.pixelHeight)*minRatio))
UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
result.drawInRect(CGRectMake(0, 0, size.width, size.height))
var final = UIGraphicsGetImageFromCurrentImageContext()
var image = iImage(uiimage: final)
self._selectediImages.append(image)
self._cacheImageComplete!++
println(self._cacheImageComplete)
if(self._cacheImageComplete == self._selectionCount)
{
self._processingImages = false
self.selectionCallback(self._selectediImages)
}
}
}
}
- Cela peut être aider à obtenir ce dont vous avez besoin, sans beaucoup plus d'efforts. Jetez un oeil à iOS code pas besoin de courir Réagir Native code : stackoverflow.com/questions/49305438/...
Vous devez vous connecter pour publier un commentaire.
Pourquoi avez-vous dit
synchronous
? Évidemment, cela va ralentir les choses en bas. En outre, en disantsynchronous
sur le thread principal est strictement interdit!!!! Lire les docs et de leur obéir. Qui est le principal problème ici.Et puis il y a beaucoup d'autres considérations. Fondamentalement, vous êtes à l'aide de cet appel tout faux. Une fois que vous avez retiré la
synchronous
, ne pas traiter l'image comme ça! Rappelez-vous, ce callback sera appelé de nombreuses fois que l'image est fournie dans les meilleures versions. Vous ne devez rien faire de temps ici.(Aussi, pourquoi êtes-vous le redimensionnement de l'image? Si vous voulais de l'image à une certaine taille, vous devriez avoir demandé que la taille lorsque vous l'a demandé. Laissez l'image de l'outil de récupération de faire le travail pour vous.)
synchronous
sur le thread principal. Qu'est ce que vous avez demandé. Si vous avez une autre question, une autre question.Ne pas redimensionner les images vous-même — une partie de ce que
PHImageManager
est pour est pour le faire pour vous. (Il met également en cache les images miniatures de sorte que vous pouvez les obtenir plus rapidement la prochaine fois, et les actions qui cache dans les applications de sorte que vous ne finissent pas avec une demi-douzaine d'applications créer une demi-douzaine de séparer les 500 MO vignette caches de l'ensemble de votre bibliothèque.)Changements notables:
requestImageForAsset
et l'utilisation de laAspectFill
mode. Ainsi, vous obtenez une image que les cultures pour remplir cette place n'importe quel son format est en.FastFormat
, alors vous pourriez obtenir des images floues de toute façon.)