2017-11-28 12 views
0

JSON APIコールから画像を読み込もうとしているときに問題があります。基本的に私は私のAPIを呼び出し、2番目のView Controllerに表示される画像URLを取得する関数を作成しました。現時点では、コンソールに印刷しているため、URLが正しく渡されていることを明確に確認できます。しかし、私はというエラーを取得しています私のUIImageを更新しようとすると:2番目のビューコントローラでUIImageを更新できません

致命的なエラー:ここ

class Exercise { 
private var _id: Int! 
private var _exerciseURL: String! 
private var _imageUrl: URL! 

var id: Int { 

    return _id 
} 

var exerciseURL: String { 

    return _exerciseURL 
} 

var imageURL: URL { 

    return _imageUrl // debug navigator is pointing at this line 
} 


init(name: String, description: String, id: Int) { 
    self._id = id 

    self._exerciseURL = "https://wger.de/api/v2/exerciseimage/?exercise=\(self.id)" 

    self._imageUrl = URL(string: "") 
} 


func parseImageData() { 

    let urlPath = _exerciseURL 
    let url = URL(string: urlPath!) 

    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in 

     if error != nil { 
      print("Error while parsing JSON") 
     } 
     else { 

      do { 
       if let data = data, 
        let fetchedImageData = try JSONSerialization.jsonObject(with: data, options: .mutableLeaves) as? [String:Any], 
        let images = fetchedImageData["results"] as? [[String: Any]] { 


        for eachImage in images { 
         let imageUrl = eachImage["image"] as! String 
         self._imageUrl = URL(string: imageUrl) 
        } 

        print(self.imageURL) 


       } 
      } 
      catch { 
       print("Error while parsing data.") 
      } 
     } 
    } 
    task.resume() 
} 

} 

:これは私のモデルクラスファイルである

オプションの値をアンラップしながら、予想外にnilを見つけそのURLに基​​づいて画像を更新するはずの2番目のビューコントローラです。

class ExerciseDetailViewController: UIViewController { 

var exercise: Exercise! 

@IBOutlet weak var exerciseImage: UIImageView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    exercise.parseImageData() 

    let data = NSData(contentsOf: exercise.imageURL) 
    exerciseImage.image = UIImage(data: data as! Data) 


    // Do any additional setup after loading the view. 
} 

} 

私は

let data = NSData(contentsOf: exercise.imageURL) 
exerciseImage.image = UIImage(data: data as! Data) 

をコメントアウトして、私は私の文の「印刷(self.imageURL)」は正しく二VCのコンソールでURLが表示されていることを見ることができ、私の結果をテストしてみたときに

。また、コードに表示されていない名前などの同じオブジェクトの他の変数は、他のラベルによって正しく表示されます。

+0

https://stackoverflow.com/questions/24643522/fatal-error-unexpectedly-found-nil-while-unwrapping-an-オプション - 値 – UghThatGuyAgain

+0

私はそれが(データ:データとして!データ) 'を入力し、私の結果をテストすると、私のステートメント' print() self.imageURL) 'が2番目のVCのコンソールにURLを正しく表示しています。 – Rvfvl

+0

ええ、私は本当にわからないスイフト、私はちょうど彼らの質問を停止しようとすることなく、他の記事と正しい方向に人々を指すのを助けるしようとする男です。 – UghThatGuyAgain

答えて

2

問題は、ネットワークの要求URLSession.shared.dataTask(with: url!)は非同期であり、ネットワーク要求が完了したとimageURLはまだnilである前にあなたがexercise.imageURLにアクセスしているということです。

私は行にブレークポイントを設定することをお勧め何が起こっているかをより良く理解を取得するには:あなたが第二のブレークポイントが最初に起動されていることがわかります

// 1. In parseImageData() 
self._imageUrl = URL(string: imageUrl) 

// 2. In viewDidLoad() 
let data = NSData(contentsOf: exercise.imageURL) 

を。

実行する必要があるのは、ネットワーク要求と解析が完了するまで待つことです。これを行うには、Swiftでコンプリートハンドラを読んでparseImageData()に変更し、完了ハンドラを受け入れます。関数の例については、この答えをチェックしてくださいhttps://stackoverflow.com/a/43317287/2247399

関連する問題