Блок завершения никогда не вызывается?

У нас есть функция, которая, когда она завершается, должна вызвать другую функцию в своем блоке завершения, но все, что находится внутри блока завершения, никогда не вызывается. Вот функция:

func appendAllData (completion: () -> Void) {

    guard let movieDetails = self.movieDetailsData else {
      // handle nil case
      return;
    }

    if let posterImage = self.movieDetailsData?.poster {
      self.posterArray.append(posterImage)
    }

    if let overview = self.movieDetailsData?.overview {
      self.overviewArray.append(overview)
    }

    if let releaseDate = self.movieDetailsData?.releaseData {
      self.releaseInfoArray.append(releaseDate)
    }

    if let runtime = self.movieDetailsData?.runtime {
      self.releaseInfoArray.append(String(describing: runtime))
    }

    if let genre = self.movieDetailsData?.genre {
      if !genre.isEmpty {
        self.releaseInfoArray.append(genre[0].name)
      }
    }

    if let budget = self.movieDetailsData?.budget {
      self.boxOfficeArray.append(budget)
    }

    if let revenue = self.movieDetailsData?.revenue {
      self.boxOfficeArray.append(revenue)
    }

    if let homepage = self.movieDetailsData?.homepage {
      self.homePageArray.append(homepage)
    }

    if let images = self.movieDetailsData?.images {
      self.imageArray += images.backdropImages.map{ $0.filePath }
    }
  }

Вот как это используется:

self.appendAllData(completion: { _ in
//Nothing inside here gets called
  DispatchQueue.main.async {

    print(self.movieDetailsData?.poster )

    if let bgImage = self.movieDetailsData?.poster {
      self.backgroundImage.sd_setImage(with: URL(string:"\(baseImageURL)\(bgImage)"))
      print("background pic loaded")
      self.backgroundImage.addBlurEffect()
    }

    self.detailTableView.reloadData()
  }
})

Внутри блока завершения ничего не вызывается, есть идеи, как это исправить?


person SwiftyJD    schedule 10.03.2017    source источник
comment
В будущем, пожалуйста, сведите вопрос только к соответствующим фрагментам кода, чтобы все его читали.   -  person Colin Basnett    schedule 10.03.2017
comment
Зачем вообще нужен блок завершения для функции, которая ничего не делает асинхронно?   -  person dan    schedule 10.03.2017
comment
@dan, возможно, его функция делает что-то асинхронное или сделает это в будущем.   -  person dst3p    schedule 10.03.2017


Ответы (1)


Я считаю, что вам нужно вызвать completion() в конце, чтобы он выполнил ваш код завершения.

func appendAllData (completion: () -> Void) {

    guard let movieDetails = self.movieDetailsData else {
      // handle nil case
      return;
    }

    if let posterImage = self.movieDetailsData?.poster {
      self.posterArray.append(posterImage)
    }

    if let overview = self.movieDetailsData?.overview {
      self.overviewArray.append(overview)
    }

    if let releaseDate = self.movieDetailsData?.releaseData {
      self.releaseInfoArray.append(releaseDate)
    }

    if let runtime = self.movieDetailsData?.runtime {
      self.releaseInfoArray.append(String(describing: runtime))
    }

    if let genre = self.movieDetailsData?.genre {
      if !genre.isEmpty {
        self.releaseInfoArray.append(genre[0].name)
      }
    }

    if let budget = self.movieDetailsData?.budget {
      self.boxOfficeArray.append(budget)
    }

    if let revenue = self.movieDetailsData?.revenue {
      self.boxOfficeArray.append(revenue)
    }

    if let homepage = self.movieDetailsData?.homepage {
      self.homePageArray.append(homepage)
    }

    if let images = self.movieDetailsData?.images {
      self.imageArray += images.backdropImages.map{ $0.filePath }
    }

    completion()
  }
person dst3p    schedule 10.03.2017
comment
Вот оно! Спасибо - person SwiftyJD; 10.03.2017
comment
Потрясающий. Если это помогло вам, рассмотрите возможность пометить это как ответ. Удачного кодирования! - person dst3p; 10.03.2017
comment
Нет встроенного механизма для вызова обработчика завершения. Если вы его не вызываете, он не запускается. - person Duncan C; 10.03.2017
comment
Вы также можете назвать это в своем защитном предложении. - person atreat; 18.01.2018