2017-12-20 14 views
2

내 이미지 URL이있는 Firebase 데이터베이스가 있습니다. 프로필 사용자 이름을 기반으로 프로필 이미지를 호출하려고합니다. profileImageURL에서 올바른 URL을 얻고 있지만 URLSession을 시작할 때마다 항상 null이 표시됩니다.URL Unwrapping 중에 예기치 않게 nil이 발견되었습니다.

if let profileImageURL = user.profileImageURL{ 

     let url = URL(string: profileImageURL) 
     URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in 
      //Download Hit an Error 
      if error != nil { 
       print(error!) 
       return 
      } 
      DispatchQueue.main.async() { 
        cell.profileNameImageView?.image = UIImage(data: data!) 
       } 
     }) 
} 

샘플 URL 문자열 : URL의 initialiser와

https://firebasestorage.googleapis.com/v0/b/instagram-caption-generator.appspot.com/o/FeaturedAccounts%2FProfileImage%2Ffeatured_2.jpg?alt=media&token=4a2774f5-f192-4f06-b7c1-a4044921c075

+1

무엇이 없습니까? 'cell.profileNameImageView'? 'url'? 'profileImageURL'은 실제로 유효한 URL 문자열입니까? 공백이 있습니까? 이스케이프 처리되지 않은 문자? – Larme

+0

URL에 아무 말도 없습니다. profileImageURL은 유효한 문자열입니다. – TDIFF

+0

여기에 복사/붙여 넣기를 할 수 있습니까? – Larme

답변

2

사용 if-let 블록 여기 내 코드입니다. 이 오류의 원인은 url-init?(string: String)의 선택적 인스턴스입니다. profileImageURL은 유효한 URL 문자열이 아니므로 URL 초기화자가 URL 클래스의 인스턴스를 만들 수 없으며 !을 사용하여 unwrap하려고하는 nil을 반환합니다.

시도해보십시오.

if let profileImageURL = user.profileImageURL{ 

    // Use if-let block with URL initialiser. 
    if let url = URL(string: profileImageURL) { // try this - if let url = URL(string: "gs://instagram-caption-generator.appspot.com/FeaturedAccoun‌​ts/ProfileImage/feat‌​ured_2.jpg") { 

    // Remove unwrapper !, from url   
    URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in 
     //Download Hit an Error 
     if error != nil { 
      print(error!) 
       return 
     } 

      if let imageData = data { 
      DispatchQueue.main.async() { 
       cell.profileNameImageView?.image = UIImage(data: imageData) 
      } 
      } else { 
      print("image data is nil") 
      } 
     }).resume() 
    } else { 
    print("url is nil") 

    } 
} 
+0

각 profileImageURL에 대해 여전히 nil을 인쇄합니다. – TDIFF

+0

그게 내가 여기서 보여주고있는 것입니다. - 'profileImageURL'은 유효한 문자열이 아닙니다.이 문자열을보십시오 :'https : // stackoverflow.com' – Krunal

+0

이것은 실제로 문제를 해결하지 않고 단지 충돌을 피합니다. – rmaddy

1

당신은 guard 또는 if let 문을 사용하고 profileImageURL랩을 해제하고는 하나 스윕과 같이 유효한 URL 실제로는 것을 확인할 수 있습니다

guard let profileImageURL = user.profileImageURL, 
     let url = URL(string: profileImageURL) else { return } 

// now you know that url is definitely a valid URL 
URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in 
    //Download Hit an Error 
    if error != nil { 
     print(error!) 
     return 
    } 

    DispatchQueue.main.async() { 
     cell.profileNameImageView?.image = UIImage(data: data!) 
    } 
}) 

당신에게 !하는 원인을 풀기 힘을 저장가 당신은 문제를 발견했습니다.

희망이 있습니다.

+0

이것은 실제로 문제를 해결하지는 않지만 충돌을 피할뿐입니다. – rmaddy

+0

@rmaddy 아니, 네 말이 맞아. 충돌을 멈추지 만 imageView는 비어있게됩니다. – pbodsk