2017-12-27 2 views
0
를 사용하여있는 UIImageView를 업데이트하는 동안

입니다 제가 구현하려는 어떤 CollectionViewCell에 사용자가 클릭 한 다음 새보기가 스크롤 및 을 확대 표시 할 때. 기본적으로 MyCollectionViewController 및 MyScrollViewController라는 두 개의 다른 클래스가 있습니다.충돌 : SDWebImage

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath){ 
    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let VC = storyboard.instantiateViewController(withIdentifier: "myScrollVC") as? MyScrollViewController 
    self.navigationController?.pushViewController(VC!, animated: true) 
    VC?.setImageToScrollView(image_URL: (self.jsonData?.HD_WALLPAPER![indexPath.row].wallpaper_image)!) 
} 

그리고 내 스크롤 뷰 컨트롤러에 코드 부분을 다음과 같은 한 : 나는 내 컬렉션 뷰 컨트롤러에 코드 부분을 다음 한 나는 SDWebImage ... 오픈 소스 라이브러리를 사용하고

import UIKit 
import SDWebImage 
class MyScrollViewController: UIViewController, UIScrollViewDelegate { 
    @IBOutlet weak var myImageView: UIImageView! 
    @IBOutlet weak var myScrollView: UIScrollView! 
    override func viewDidLoad(){ 
     super.viewDidLoad() 
     self.myScrollView.minimumZoomScale = 1.0 
     self.myScrollView.maximumZoomScale = 6.0 
    } 
    public func setImageToScrollView(image_URL: String){ 
     DispatchQueue.main.async { 
      self.myImageView!.sd_setImage(with: URL(string: image_URL), completed: { 
       (image, error, cacheType, url) in 
       //Completion Block ... Do Nothing 
      }) 
     } 
    } 
    override func didReceiveMemoryWarning(){ 
     super.didReceiveMemoryWarning() 
    } 
    func viewForZooming(in scrollView: UIScrollView) -> UIView?{ 
     return self.myImageView 
    } 
} 

이미지 캐싱을 관리합니다.

문제 : 때때로 이미지가 오류없이 성공적으로로드되지만 시간 내 응용 프로그램의 가장 충돌는 다음과 같은 오류와 함께 sd_setImage API 프레임 워크 SDWebImage 의를 실행하는 동안 ...... enter image description here

치명적인 오류 : 옵션 값

을 풀기 동안 예기치 않게 전무 발견

QUERY :

  1. 첫째 난과 pushViewController라고하고 나는 정의 함수 내 사용자 지정했다. 콜렉션 뷰 셀에서 함수를 호출하는 적절한 방법입니까?
  2. 선택 값을 unwrapping하는 동안 예기치 않게 nil이 발견 된 이유는 무엇입니까? 오류가있는 이미지 URL을 얻을 수는 있지만.
+0

'self.myImageView'는'nil' 인 것 같습니다. –

+0

@RajibTheKing 강제로 이미지를 래핑하지 않고 imageView에 바인딩하도록 할 경우 수행하십시오. 언젠가는 귀하의 응용 프로그램이 언젠가는 귀하의 애플 리케이션이 추락 얻을 점점 –

답변

0

질문으로 돌아 간다 :

Firstly I called pushViewController and then I called my custom defined function. Is it proper way to call functions from collection view cell?

대답을 여기에 당신이있는 viewDidLoad까지 매장을 참조하는 함수를 호출해야한다는 것입니다. 아울렛은 암시 적으로 unwrapped 된 선택 사항이지만 viewDidLoad까지는 거기에있는 것이 보장되지 않습니다. 그래서, 당신은 경쟁 조건을 가지고 있습니다. 때로는 효과가 있습니다. 당신이 URL을 전달하지만, 함수를 호출하지 않도록

변경을 : imgUrl에이 MyScrollViewContainer에서 인스턴스 변수가

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath){ 
    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let VC = storyboard.instantiateViewController(withIdentifier: "myScrollVC") as? MyScrollViewController 
    self.navigationController?.pushViewController(VC!, animated: true) 
    VC.imgURL = self.jsonData?.HD_WALLPAPER![indexPath.row].wallpaper_image)! 
} 

. 그런 다음 imgURL을 전달하여 viewDidLoad에서 함수를 호출하십시오.

override func viewDidLoad(){ 
    super.viewDidLoad() 
    self.myScrollView.minimumZoomScale = 1.0 
    self.myScrollView.maximumZoomScale = 6.0 
    setImageToScrollView(image_URL: imgURL) 
} 

그러면 통화 시간이 변경되어 기능 호출시 실제로 콘센트가 있는지 확인하십시오.

는 === 나머지는 내 이전 대답 (여전히 관련,하지만 문제가 해결되지 않는)입니다 === 당신은 Dispatch.async에서 SetImage 호출을 래핑 할 필요가 없습니다

합니다. 함수는 한 줄이어야합니다.

public func setImageToScrollView(image_URL: String){ 
    self.myImageView.sd_setImage(with: URL(string: image_URL)) 
} 

이렇게하면 문제가 해결됩니다.SetImage는 자체 디스패치를 ​​수행하고 콘센트가 여전히 존재하는 경우에만 UI를 업데이트합니다.

다른 주석가들은 왜 코드가 때때로 충돌하는지 (비동기 블록이 완료되면 self.myImageView가 nil이 될 수 있음)와 UIImageView 콘센트가 아직 있는지 확인하기 위해 바인딩 또는 가드를 보류하는 경우 보호 방법을 지적했습니다. 그것들은 일반적으로 관련 기술입니다. 그러나 SetImage가 모든 것을 처리합니다.

+0

처음에 내 기능은 정확하게 당신이 작성한 것과 동일했습니다. 그러나 그것은 종종 부서지기 시작했습니다. DispatchQueue.main.async 블록을 추가하면 충돌 속도가 감소합니다. 하지만 여전히 해결되지 않았습니다. 당신의 노력에 감사드립니다. @ozzieozumo – RajibTheKing

관련 문제