2015-08-09 3 views
3

Я пытаюсь лениво загрузить собственность (UIImage) с запросом Alamofire. Это где я нахожусь:Swift lazy load property Запрос Alamofire

public lazy var theImage: UIImage = MyCalass.loadImage { (imageTest) -> Void in 
    return imageTest 
} 

class public func loadImage(completion: (imageTest: UIImage) -> Void){ 
    Alamofire.request(.GET, "http://pathtoimage/image.jpg").response { (request, response, data, error) in 
     var tempImage = UIImage(data: data!, scale:1) 
     completion(imageTest: tempImage!) 
    } 
} 

ошибка на: «()» не конвертируется в «UIImage»

+2

'LoadImage (_ :)' не имеет возвращаемого значения (т.е. 'Void', a.k.a'() '); вы пытаетесь присвоить ленивое свойство типа 'UIImage' возвращаемому значению функции, которая не возвращает изображение. – mattt

+0

Для асинхронной задачи, такой как запрос изображения, ленивые или вычисленные свойства не будут подходящим решением. – mattt

+0

Довольно легко сделать вызов метода, я просто экспериментировал с ленивой загрузкой –

ответ

0

Если вы работаете с изображениями, я рекомендую вам использовать что-то вроде DLImageLoader , он может быть установлен с CocoaPods, для загрузки изображения просто использовать

DLImageLoader.sharedInstance().displayImageFromUrl("\(thumbnailUrl)", imageView: myImageView) 

Таким образом, ваш образ загружается при окончании загрузки, а также проверить другие варианты, есть некоторые с обратными вызовами, но приведенный выше пример является простейший

И даже он использует кеш, если вам нужно изображение несколько раз в вашем приложении, у меня есть его реализация и работает хорошо, и у меня есть Alamofire. Я пришел к этому дополнению, когда я заменил AFNetworking, который используется, чтобы этот вид изображения управления загрузками

2

Эй людей его легко решить с НОДОМ ...

Просто построить класс вроде этого:

class AsynchImageLoader { 
    class func loadImageAsync (imageURL: NSURL, completionHandler: (downloadedImage: UIImage?) -> Void) { 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {() -> Void in 
      if let imageData: NSData = NSData(contentsOfURL: imageURL) { 
       if let imageImage: UIImage = UIImage(data: imageData) { 
        dispatch_async(dispatch_get_main_queue(), {() -> Void in 
         completionHandler(downloadedImage: imageImage) 
        }) 
       } else { 
        dispatch_async(dispatch_get_main_queue(), {() -> Void in 
         completionHandler(downloadedImage: nil) 
        }) 
       } 
      } else { 
       dispatch_async(dispatch_get_main_queue(), {() -> Void in 
        completionHandler(downloadedImage: nil) 
       }) 
      } 
     }) 
    } 
} 

И чем загружать изображения, как это ...

let imageView: UIImageView = UIImageView() 
     AsynchImageLoader.loadImageAsync(NSURL(string: "yourURL")!, completionHandler: { (downloadedImage) -> Void in 
      imageView.image = downloadedImage 
     }) 

downloadedImage может быть ноль, если что-то пошло не так ... иначе вы могли бы поставить его в ваш взгляд, или массив, или что угодно ...

Кстати ... Ленивый модификатор не означает, что изображение загружается «ленивым/асинхронным» ... В Swift вы можете объявить/инициализировать что-то как ленив, что означает, что он будет объявлен по инициативе его класса, но он будет сначала инициализирован незадолго до того, как вы сначала попытаетесь получить к нему доступ в коде ... Это может быть любое время или даже никогда :-)

Или изменить свой код от этого ...

public lazy var theImage: UIImage = MyCalass.loadImage { (imageTest) -> Void in 
    return imageTest 
} 

к этому ...

var theImage: UIImage? 
MyCalass.loadImage { (imageTest) -> Void in 
    theImage = imageTest 
} 
0

Вам не нужно использовать Alamofire для загрузки изображения. Вы можете сделать его асинхронным.

Вы могли бы сделать что-то подобное, закрытие включено:

lazy var theImage: UIImage = { 
    var sampImage = getImage({ (image) in 
     return image 
    }) 
}() 

func getImage(completion: UIImage ->()) { 
    var newImage: UIImage? 

    let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 
    dispatch_async(dispatch_get_global_queue(priority, 0)) { 
     let url = NSURL(string: "http://pathtoimage/image.jpg") 
     let data = NSData(contentsOfURL: url!) 
     newImage = UIImage(data: data!)! 

     completion(newImage!) 
    } 
} 

EDIT: Я был в состоянии успешно загрузить изображение в файле Playground, используя этот код ниже. Ранее проблема заключалась в том, что запрос был асинхронным, что по какой-то причине привело к неправильному возврату.

import UIKit 

class Example { 

    lazy var theImage: UIImage = { 

     var newImage: UIImage? 

     let url = NSURL(string: "http://2.bp.blogspot.com/-XJbC3jA7cOo/VW2ItW5aRjI/AAAAAAAACcc/_f_WhTEXvFQ/s1600/testPattern.png") 
     let data = NSData(contentsOfURL: url!) 
     newImage = UIImage(data: data!)! 

     println(data) 

     return newImage! 
    }() 

    init() {} 
} 

var exp = Example() 

exp.theImage 

Я имею в виду, что вызов функции не допускается в ленивых нагруженных свойства