2016-11-30 2 views
0

Firebase 저장소에서 이미지를 다운로드하려고합니다. 이 코드를 실행하면 Firebase 저장소 이미지 다운로드

func downloadThumbnail(thumbnail: String) -> URL { 
    var thumb: URL! 
    let _ = DataService.dataService.TAG_PHOTO_REF.child("\(thumbnail)").downloadURL { (thumbnailUrl, error) in 
     if error != nil { 
      print(error?.localizedDescription as Any) 
     } else { 
      thumb = thumbnailUrl 
     } 
    } 
    return thumb 
} 

cell.photo.kf.setImage(with: downloadThumbnail(thumbnail: selectedTag.thumbnail)) 

나는 return thumb 라인

fatal error: unexpectedly found nil while unwrapping an Optional value

을 얻었다.

하지만 반환 대신 print(thumbnailUrl) 만 실행하면 올바른 미리보기 이미지 URL이 인쇄됩니다. 누구든지 왜이 오류가 발생했는지 알 수 있습니까?

감사합니다.

답변

2

엄지가 결코 0이 될 수 있다고 보장 할 수는 없습니다. 이것 때문에, 당신은 사용해서는 안됩니다! 사용자가 제어 할 수없고 수동으로 설정하지 않았으므로 선택적으로 설정해야합니다.

var thumb: URL? 

둘째, 인터넷 전화가 있습니다. 그 전화에 대한 응답을 받기 전에 엄지 손가락을 돌려 보내고 있습니다. 엄지 손가락은 아무 것도 없지만 당신은 그걸로 우리에게 말했습니다! 그건 불가능한 일 이니까, 당신은 추락합니다.

중단 점을 넣으면 if error != nil 줄을 누르기 전에 메서드에서 return thumb을 누르게됩니다. firebase에서 응답을 받기 전에 메서드가 항상 반환되기 때문에 반환 값을 사용할 수 없으므로 URL은 항상 nil이됩니다. 대신 URL을 완료로 보냅니다.

나는 firebase 코드를 확인하지 않았지만 모두 정상인 경우 원하는 순서입니다.

그래서 :

func downloadThumbnail(thumbnail: String,withCompletion comp: @escaping (URL?, Error?) ->()) { 
    let _ = DataService.dataService.TAG_PHOTO_REF.child("\(thumbnail)").downloadURL { (thumbnailUrl, error) in 
    if error != nil { 
     print(error?.localizedDescription as Any) 
     comp(nil, error) 
    } else { 
     comp(thumbnailUrl, nil) 
    } 
    } 
} 

그래서 당신은 다른 곳을 호출 할 때 :

func getMyImage(cell: UITableViewCell) { 
    downloadThumbnail(thumbnail: selectedTag.thumbnail) { (thumbnailUrl, error) in 
    if error != nil { 
     //show some sort of alert for the user here? or do something to handle the error? 
    } else { 
     //the url is an optional URL, so check to make sure it isn't nil 
     if let url = thumbnailUrl { 
     cell.photo.kf.setImage(with: url) 
     } else { 
     //you didn't get an error from your firebase response 
     //but the thumbnail url it gave you is broken for some reason 
     //so again, do something about your error here 
    } 
    } 
} 

이 앱의 디자인 패턴과 일치 알려하지 않습니다. 나는 당신이 tableview를 사용하고 있다고 가정했고,이 메소드들은 다른 클래스에 있다고 생각했다.

+0

감사합니다. – Brkr

관련 문제