0

現在、Alamofire を使用してサーバーから Json データ/URL イメージを取得しています。

すべて正常に動作し、サーバーからすべての 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)!)

        }

    }
}
4

1 に答える 1

1

だから私は解決策を見つけました。基本的に、このチュートリアルを使用してカスタム レスポンス シリアライザーを作成しました。

このようにして、UIImage に変換する必要がある NSData を受け取る代わりに、カスタム応答シリアライザーを記述して、UIImage に直接変換することができます。

カスタム レスポンス

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

次に、cellForIndexAtIndexPath 内の Alamofire リクエストで見つかった responseImage を使用しました

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
    }
  }
}
于 2014-12-19T10:32:28.693 に答える