2014-12-19 4 views
1

현재 Alamofire를 사용하여 서버에서 Json 데이터/URL 이미지를 가져옵니다. 또한 요청시 URL 이미지를 UIImages로 변환하기 위해이 tutorial을 사용하여 사용자 지정 응답 serializer를 만들었습니다.Swift Custom Response Serializer가 임의로 이미지를 반환합니다.

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

문제점 사용자 지정 응답이 이미지를 다른 순서로 반환한다는 문제가 있습니다.

따라서 표시되는 모든 이미지의 시작 순서가 올바르지 않습니다.이 문제를 어떻게 해결할 수 있는지 알 수 있습니까?

내가 작동하게 만들 수있는 유일한 방법은 0 ... 4까지 반복하는 것입니다. 하지만 NSMutableArray 전체를 반복해야합니다.

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) 

     ###fetch json images and convert nsdata to image 
     ###for some odd reason the order doesn't change if i do. (i < 4) 
     for var i = 0; i < self.mutable_pages.count; i++ { 
      let urlString: NSString = self.mutable_pages[i] as NSString 
      var imgURL: NSURL = NSURL(string: urlString)! 

      ###So far the images are in the order that I want 
      Alamofire.request(.GET, imgURL).responseImage() { 
       (request, _, image, error) in 

       if error == nil && image != nil { 
        dispatch_async(dispatch_get_main_queue(), { 

         ###Somehow the images get appended at a random order, why? 
         self.pageImages.append(image!) 
        }) 
       } 
      } 

     } 
    } 
} 

사용자 정의 응답

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

###This returns the images in a different order... 
    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) 
    }) 
    } 
} 

답변

2

은 어떻게 든 이미지는 임의의 순서로 추가, 왜 얻을?

비동기 요청 또는 비동기 적으로 전달 된 블록의 순서가 보장되지 않기 때문입니다.

이미지를 배열에 추가하는 대신 해당 페이지 (예 : pages[i] = image)에 따라 사전에 입력해야합니다 (단, for i in 0..<pages.count { ... }을 사용하는 것이 더 쉽고 간편합니다).

AFNetworking의 UIImageView 카테고리를 사용하여 필요할 때만 이미지를 요청하십시오.

관련 문제