2017-11-02 3 views
0

내가 사용 사진 객체의 배열을 얻을 플리커의 API플리커 API

를 사용하여 검색 URL을 사용하여 imageView에 하나의 이미지를로드하려고 사용하여 이미지 뷰에 이미지로드 :

private func performSearchWithText(searchText: String) { 
    UIApplication.shared.isNetworkActivityIndicatorVisible = true 
    FlickrProvider.fetchPhotosForSearchText(searchText: searchText, onCompletion: { (error: NSError?, flickrPhotos: [FlickrPhoto]?) -> Void in 
    if error == nil { 
     self.photos = flickrPhotos! 
    } else { 
     self.photos = [] 
     if (error!.code == FlickrProvider.Errors.invalidAccessErrorCode) { 
     DispatchQueue.main.async(execute: {() -> Void in 
      self.showErrorAlert() 
     }) 
     } 
    } 

    DispatchQueue.main.async(execute: {() -> Void in 
     self.loadImageWithUrl() 
    }) 
    }) 
} 

을 그 로 이미지 하나로드해야 마지막 메소드 호출 self.loadImageWithUrl()imageViewpop() 비아 :

private func loadImageWithUrl() { 
    var photo = photos.popLast() 
    if photo != nil { 
    imageView.sd_setImage(with: photo!.photoUrl.absoluteURL as URL!) 
    } 
} 
,174,

사진은로드 결코, 나는 다음과 같은 디버거에서 오류 얻을 :

스레드 1 : EXC_BAD_INSTRUCTION (코드 = EXC_I386_INVOP, 서브 코드 = 0x0으로)

내가 스위프트에 새로운 오전, 그래서하시기 바랍니다 분명한 함정이나 의미상의 오류를 용서하십시오.

+0

전체 오류는 무엇입니까? –

+0

imageView는 이미지를로드하지 않으며 해당 스레드 1 오류가 디버거에 표시됩니다. 나는 비동기를 어떻게 사용하고 있는지를 스레딩 문제로 생각한다. 그것이 내 지식에 대한 오류의 전부입니다. @StephenPaul –

+0

'sd_setImage' 란 무엇입니까? – matt

답변

0

디버거가 코드에서 어떤 행에 멈 춥니 다? 문제를 일으킬 수있는 변수는 nil 인 변수이며 코드에서 강제로 제거되지 않습니다. 자 이제이 코드를 정리해 봅시다.

당신이 항상 옵션에서 값을 반환한다고 가정하는 것이 안전하지 않으므로 nil의 가능한 경우를 경계해야합니다. 그렇지 않으면 앱이 오류가 발생하기 쉽습니다. 또한 이미지로 imageView을로드하려는 것처럼 보이지만 1) 오류가없고 2) imageView을로드 할 데이터 소스가있는 경우에만 닫아야합니다. 이렇게 클로저 안에 넣지 마십시오. 당신이 당신의 photos 변수 선택을 할 경우

private func performSearchWithText(searchText: String) { 
    UIApplication.shared.isNetworkActivityIndicatorVisible = true 
    FlickrProvider.fetchPhotosForSearchText(searchText: searchText, onCompletion: { (error: NSError?, flickrPhotos: [FlickrPhoto]?) -> Void in 
     if let error = error { 
      DispatchQueue.main.async { 
       self.showErrorAlert() 
      } 
     } else { 
      guard let photos = flickrPhotos else { 
       self.photos = [] 
       return 
      } 
      self.photos = photos 
      DispatchQueue.main.async { 
       self.loadImageWithUrl() 
      } 
     } 
    } 
} 

은 그것도 더 정리 될 수있다. 어쨌든, 그 코드를 시도하고 여전히 충돌을 볼 수 있습니다.

+0

감사합니다. I this은이 문제를 해결하기 위해 충돌을 막을 수 있었고 API 호출에 대한 2 차 문제를 발견했습니다. 이것은 또한 스위프트 3가 dispatchQueue로 만든 업데이트를 명확히하는데 도움이되었습니다. –

+0

좋아요! 나는 행복하게 도와 줬다. –

관련 문제