2014-12-17 5 views
0

В настоящее время я использую Alamofire для получения данных/url-изображений Fetch с сервера.loop and append json data в UIImage [] в Background Swift

Все работает нормально, и я могу загрузить все URL-изображения с сервера в UIImageView. Затем пользователь может прокручивать слева направо, чтобы просмотреть каждое изображение, как в фотогалерее.

В настоящее время, когда я беру данные, я прохожу через свой NSArray, конвертирую каждый url, чтобы стать имиджем, а затем добавьте каждое изображение в UIImage [].

Цитирование через NSArray действительно замедляет мое приложение, когда оно начинается, есть ли способ ускорить этот процесс? Или лучший/более быстрый способ скрывать URL-адреса в образах в фоновом режиме?

var pages = NSArray() 

var mutable_pages = NSMutableArray() 
var pageImages: [UIImage] = [] 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.fetchPages() 

} 

func fetchPages() { 
    Alamofire.request(.GET, "http://www.myurl.com/api/pages.json").responseJSON() { 
     (_, _, data, _) in 

     self.pages = data!.valueForKey("page_url") as NSArray! 

     self.mutable_pages = NSMutableArray(array: self.pages) 

     ###THIS IS REALLY SLOW, IS THERE A FASTER SOLUTION 
     for var i = 0; i < self.mutable_pages.count; i++ { 

      ###Construct the imgUrl to get an image URL for the pages 
      let urlString: NSString = self.mutable_pages[i] as NSString 
      var imgURL: NSURL = NSURL(string: urlString)! 
      var imgData: NSData = NSData(contentsOfURL: imgURL)! 

      ###append each image into UIImage 
      self.pageImages.append(UIImage(data: imgData)!) 

     } 

    } 
} 
+1

Если профиль проекта, я думаю, вы обнаружите, что 'уаг imgData : NSData = NSData (contentsOfURL: imgURL)! '- это то, что действительно занимает больше всего времени. Я также не думаю, что это происходит; выборка изображений является интенсивной задачей. – 68cherries

+2

Убедитесь, что выборка/декодирование изображений выполняется с основного потока. Вы также должны будете проектировать свое приложение, чтобы обрабатывать любое время, когда изображения недоступны, так как они все еще загружаются. – nielsbot

+2

Вы также можете ленить фотографии. Извлеките, скажем, первые 3 изображения (изображение 0, изображение 1 и изображение n), а затем каждый раз, когда пользователь выполняет поиск, выберите следующее изображение (изображение 2, если они проведите по экрану вправо, изображение n-1, если они проведите влево) – Paulw11

ответ

1

Так что я понял решение. Я по существу создал настраиваемый сериализатор ответа, используя этот tutorial.

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

CUSTOM РЕАКЦИЯ

extension Alamofire.Request { 
    class func imageResponseSerializer() -> Serializer { 
    return { request, response, data in 
     if data == nil { 
     return (nil, nil) 
     } 

     let image = UIImage(data: data!, scale: UIScreen.mainScreen().scale) 

     return (image, nil) 
    } 
} 

    func responseImage(completionHandler: (NSURLRequest, NSHTTPURLResponse?, UIImage?, NSError?) -> Void) -> Self { 
    return response(serializer: Request.imageResponseSerializer(), completionHandler: { (request, response, image, error) in 
     completionHandler(request, response, image as? UIImage, error) 
    }) 
    } 
} 

Затем я использовал responseImage найденный в запросе Alamofire внутри cellForIndexAtIndexPath

var request: Alamofire.Request? 

cell.request = Alamofire.request(.GET, imageURL).responseImage() { 
    (request, _, image, error) in 
    if error == nil && image != nil { 
    if request.URLString == cell.request?.request.URLString { 
     cell.imageView.image = image 
    } 
    } 
}