2017-01-13 13 views
1

私は、スクロール可能なアイテムとして画像を持つピッカービューを持っています。私はUnexptected non-void return value in void functionエラーが出てくるので、私のデータベースからそれらのイメージを引き出す必要があります。ここに私のコードは次のとおりです。非同期呼び出しから画像を返す

func pickerView(_ pickerView: AKPickerView, imageForItem item: Int) -> UIImage { 
    let imgRef = FIRStorage.storage().reference().child("profile_images").child(pets[item]) 
    imgRef.data(withMaxSize: 1 * 1024 * 1024) { (data, error) -> Void in 
     // Create a UIImage, add it to the array 
     let pic = UIImage(data: data!) 
     return pic 
    } 
} 

だから、これが動作しない理由を私は理解しますが、私はこれを回避するための最良の方法だものを見つけるのに苦労しています。私が考えることのできる解決策の1つは、コールバックが発生するまで画像を汎用写真に設定してから、ピッカービューの画像を取得した画像に更新することです。しかし、個々のピッカービューアイテムにアクセスしてそのイメージを更新する方法はわかりません。

いくつかの経験を持つ誰もが、私はそれを大幅に感謝したい非同期呼び出しからのデータにこれらの項目を設定する私の目標を達成することができますどのように私に助言を与えることができれば!

+0

、それはコールバックを使用することをお勧めします。あなたは私の答えをもっと見ることができます。 – KrishnaCA

+0

問題が解決したかどうかわかりますか? – KrishnaCA

+0

問題は実際問題です。非同期呼び出しから* anything *を返そうとするのは、それを行う方法ではなく、非同期関数の性質に反します。コールバックを使用しないでください。これは、コードが過度に複雑になり、保守が困難になるためです。簡単な解決策は、firebaseを呼び出すことです。これにより、closure内のイメージが返されます。その後、配列に追加します(データソースが配列であると仮定します)。次に、ピッカービューを更新します。 – Jay

答えて

1

ここの機能は非同期機能です。この場合、コールバックを使用する必要があります。目的の結果を得るために、次のように関数を書き換えることができます。

func pickerView(_ pickerView:AKPickerView, imageForeItem item:Int, completion:(_ resultImg: UIImage)->Void) { 

    let imgRef = FIRStorage.storage().reference().child("profile_images").child(pets[item]) 
    imgRef.data(withMaxSize: 1 * 1024 * 1024) { (data, error) -> Void in 
     // Create a UIImage, add it to the array 
     if let pic:UIImage = UIImage(data: data!) { 
      completion(pic) 
     } 
    } 
} 

次のようにこれを呼び出すことができます。これは非同期関数であるので

self.pickerView(pickerView, imageForeItem: 0) { (image) in 
    DispatchQueue.main.async { 
     // set resulting image to cell here 
    } 
} 

はこれが改善するために、編集内容を提案するお気軽に:)

関連する問題