2017-12-21 17 views
0

私は、利用可能なKolodaViewを実装しています:https://github.com/Yalantis/KolodaviewForCardAt関数はUIViewを返し、UIViewには画像をダウンロードする必要があります。問題は、関数自体がUIViewの戻り値の型を期待していることですが、私はsetupCardメソッドの完了ブロックがいつ実行されたかを知る方法がないため、完了ブロックでの代わりに空の 。完成ブロックにreturn aを追加しようとしましたが、これは許可されていません。補完ブロックの実行後にカードが返されることを保証するために、以下のコードをどのように変更できますか?完了ブロックスウィフトの返信

func koloda(_ koloda: KolodaView, viewForCardAt index: Int) -> UIView { 

    var a = FlatCard() 
    if let listings = all_listings { 
     if index < listings.count { 
      setupCard(index: index, listings: listings, { (complete, card) in 
       if (complete) { 
        a = card 
       } 
      }) 
      return a 
     } 
    } 
    return a 
} 

func setupCard(index: Int, listings : [Listing], _ completionHandler: @escaping (_ complete: Bool, _ card : FlatCard) ->()) ->(){ 

    let curr_card = FlatCard() 

    if let main_photo_url = listings[index].pic1url { 
     URLSession.shared.dataTask(with: main_photo_url, completionHandler: { (data, response, error) in 

      if (error != nil) { 
       print(error) 
       return 
      } 

      DispatchQueue.main.async { 
       curr_card.mainFlatImage = UIImage(data: data!) 
      } 
     }) 
     completionHandler(true,curr_card) 
     return 
    } else { 
     completionHandler(true,curr_card) 
     return 
    } 
} 
+0

'FlatCard'は何ですか? –

答えて

1

準備が整う前に何かを返すことはできません。

個人的に、私はFlatCardを更新して、画像自体をダウンロードし、完了したら自分のビューを更新できるようにします。

class FlatView: UIView { 

    var imageURL: URL? { 
     didSet { 
      if let imageURL = newValue { 
       // download image, if success set the image on the imageView 
      } 
     } 
    } 
} 

の線に沿って何かその後、あなたは他の関数内で行う必要があり、そのすべてがある...

func koloda(_ koloda: KolodaView, viewForCardAt index: Int) -> UIView { 

    var a = FlatCard() 
    if let listings = all_listings { 
     if index < listings.count { 
      a.imageURL = listings[index].pic1url 
     } 
    } 
    return a 
} 
関連する問題