2014-12-17 2 views
0

현재 Alamofire를 사용하여 서버에서 Json 데이터/URL 이미지를 가져옵니다.루프를 반복하고 Background Swift에서 UIImage []에 추가하십시오.

모든 것이 잘 작동하고 UIImageView에 서버의 모든 URL 이미지를로드 할 수 있습니다. 사용자는 사진 갤러리처럼 각 이미지를보기 위해 왼쪽에서 오른쪽으로 스 와이프 할 수 있습니다.

현재 데이터를 가져올 때 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

의 내부 Alamofire 요청에있는 responseImage을 사용

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) }) } } 

, 나는 당신이'var에 imgData를 찾을 생각 : NSData = NSData (contentsOfURL : imgURL)! '는 실제로 가장 많은 시간을 사용하고 있습니다. 나는 또한이 주변에 어떤 생각이 들지 않는다. 이미지를 가져 오는 것은 집중적 인 작업입니다. – 68cherries

+2

이미지 가져 오기/디코딩이 메인 스레드에서 완료되었는지 확인하십시오. 이미지를 다운로드하는 중이기 때문에 이미지를 사용할 수없는 경우 언제든지 처리하도록 앱을 디자인해야합니다. – nielsbot

+2

이미지를 게으르게 가져올 수도 있습니다. 처음 3 개의 이미지 (이미지 0, 이미지 1 및 이미지 n)를 가져온 다음 사용자가 스 와이프 할 때마다 다음 이미지를 가져옵니다 (오른쪽으로 스 와이프하면 이미지 2, 왼쪽으로 스 와이프하면 이미지 n-1) – Paulw11

답변

1

그래서 해결책을 찾아 냈습니다. 본질적으로이 tutorial을 사용하여 사용자 지정 응답 직렬기를 만들었습니다.

이렇게하면 UIImage로 변환해야하는 NSData를받는 대신 사용자 지정 응답 serializer를 작성하여 UIImage로 직접 변환 할 수 있습니다.

사용자 정의 응답 프로젝트를 프로파일하는 경우 그때 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 
    } 
    } 
} 
관련 문제