私はFlickrの画像を表示するView Controllerを持っています。 Flickr APIリクエストメソッドを別のクラス "FlickrAPIRequests"に入れて、データを取得したときにビューコントローラでイメージを更新する必要があります。 2つのクラスの結合を取り除くために、プロトコルを使用してそれを選択します。どのように私はそれを達成するだろうか?Swift 3でプロトコルを正しく設定する方法
答えて
私はsilentBobの答えに続き、それは私のためにうまくいかなかったことを除いて素晴らしかったです。私は私がやったことであるので、ここでは、シングルトンとしてFlickrAPIRequestsクラスを設定するために必要な:ビューコントローラで
protocol FlickrAPIRequestDelegate{
func showFlickrPhoto(photo: UIImage) }
クラスFlickrAPIRequests {
private static let _instance = FlickrAPIRequests()
static var Instance: FlickrAPIRequests{
return _instance
}
var flickrDelegate: FlickrAPIRequestDelegate? = nil
// Make the Flickr API call
func flickrAPIRequest(_ params: [String: AnyObject], page: Int){
それから私は、検索ボタンを押したとき:
// Set flickrDelegate protocol to self
FlickrAPIRequests.Instance.flickrDelegate = self
// Call the method for api requests
FlickrAPIRequests.Instance.flickrAPIRequest(paramsDictionary as [String : AnyObject], page: 0)
さらに、プロトコルに準拠するView Controllerの拡張機能があります。
extension FlickrViewController: FlickrAPIRequestDelegate{
func showFlickrPhoto(photo: UIImage){
self.imgView.image = photo
self.prepFiltersAndViews()
self.dismissAlert()
}
}
APIメソッドは、私はメインスレッド内のプロトコルメソッドを呼び出す写真を返すとき:
// Perform this code in the main UI
DispatchQueue.main.async { [unowned self] in
let img = UIImage(data: photoData as Data)
self.flickrDelegate?.showFlickrPhoto(photo: img!)
self.flickrDelegate?.setPhotoTitle(photoTitle: photoTitle)
}
このようなプロトコル、または同様書く
:ビューコントローラは、別名、このようなプロトコル方式(複数可)を(任意の方法が存在することができる)を使用し、そのプロトコルに準拠している必要がありprotocol FlickrImageDelegate: class {
func displayDownloadedImage(flickrImage: UIImage)
}
を
weak var flickrDelegate: FlickrImageDelegate? = nil
:
class ViewController:UIViewController, FlickrImageDelegate {
displayDownloadedImage(flickrImage: UIImage) {
//handle image
}
}
はその後FlickrAPIRequestsに、あなたはこのようなデリゲートプロパティを持っている必要があります
self.flickrDelegate.displayDownloadedImage(flickrImage: downloadedImage)
あなたは(コールバックブロックを使用して検討するかもしれない:0これはFlickrAPIRequestsをインスタンス化する際に、コントローラを表示するために、そのインスタンスflickrDelegateプロパティを設定し、画像のダウンロード方法、あなたが画像をダウンロードするとき、あなたはこれを呼び出すには、ビューコントローラで使用されていますクロージャ)FlickrAPIRequestsで、あなたがそれを噛んだ後、FRP、約束などを見てください。
あなたはプロトコルを定義し、FlickrAPIRequests
クラスをデリゲートを取るように設定することができます。私は別のアプローチを提案する。
FlickrAPIRequests
に完了ハンドラを使用する方法を設定します。それは次のようになります。
func downloadFileAtURL(_ url: URL, completion: @escaping DataClosure)
FlickrAPIRequests
機能は、ファイルがダウンロードされた後に実行するためにダウンロードするだけでなく、コードのブロックするファイルへのURLを取るだろう。
あなたは(この例では、クラスがDownloadManagerと呼ばれている)このよう
DownloadManager.downloadManager.downloadFileAtURL(
url,
//This is the code to execute when the data is available
//(or the network request fails)
completion: {
[weak self] //Create a capture group for self to avoid a retain cycle.
data, error in
//If self is not nil, unwrap it as "strongSelf". If self IS nil, bail out.
guard let strongSelf = self else {
return
}
if let error = error {
print("download failed. message = \(error.localizedDescription)")
strongSelf.downloadingInProgress = false
return
}
guard let data = data else {
print("Data is nil!")
strongSelf.downloadingInProgress = false
return
}
guard let image = UIImage(data: data) else {
print("Unable to load image from data")
strongSelf.downloadingInProgress = false
return
}
//Install the newly downloaded image into the image view.
strongSelf.imageView.image = image
}
)
をその機能を使用する場合があります私はGithubの上のサンプルプロジェクトがAsyc_demo(リンク)と呼ばれてい私は「のような簡単なダウンロードマネージャを使用したこと上記に概説した。
完了ハンドラを使用すると、完了したダウンロードを処理するコードを呼び出してすぐにダウンロードを開始することができます。コードは現在のスコープにアクセスできるため、ダウンロード後の画像データの配置場所を知ることができます。 。
委任パターンを使用すると、進行中のダウンロードを覚えていて、完了後にどのような処理を行うかを認識できるように、ビューコントローラに状態を設定する必要があります。
- 1. Rails 3アプリでエンコーディングを正しく設定する方法は?
- 2. swift - UITextViewを正しく設定する方法
- 3. Swiftでの設定とプロトコル
- 4. Swiftでスタティックセルを正しく実装する方法3
- 5. Swift 3プロトコルと委任方法?
- 6. Swift 3でSDWebImageを使用してUITableViewCellでImageViewを正しく設定する方法
- 7. Maven 3を正しく設定する
- 8. Swift 3にバックグラウンドミュージックを正しく配置する方法は?
- 9. SwiftでValidIndexCollectionプロトコルを作成する3
- 10. Swiftプロトコルを使用してiTunes ScriptingBridgeのプロパティを設定する方法
- 11. Swift 3でUIButtonの画像を設定する方法は?
- 12. Swift 3 iosでHockeyAppを設定する方法
- 13. Swift 3:AppDelegateでUINavigationBar setBackgroundImageを設定する方法
- 14. Swift 3のPickerViewで行のタイトルを設定する方法は?
- 15. Swift 3でeditButtonItemのタイトルを設定する方法
- 16. SwiftのUserDefaultsから配列を正しく設定解除する方法
- 17. JavaMailのタイムアウト設定を正しく設定する方法
- 18. ハイドープ設定でs3a設定を正しく設定する方法は?
- 19. Swift 3 Completion Handler Blockを正しく書き込む方法
- 20. Swift 3でCookieを設定する
- 21. Swift 3でOpenGLを設定する
- 22. 現在の場所をrequest.sourceに設定する方法Swift 3
- 23. Swift 3アップグレードのプロトコルを廃止する
- 24. レール3ネストされた属性を正しく設定する方法
- 25. Swiftでボタンを設定する方法
- 26. Swiftのプロトコル拡張3
- 27. Swift 3オプションのプロトコル用バインド
- 28. xamppでOSXでphp_gmpを正しく設定する方法
- 29. 正規のリンクを正しく設定する方法
- 30. Swift 3、プロトコルに準拠したクラスのオブジェクトを返すプロトコルで機能する
ありがとうございました、この答えは私を助けたが、私は、余分な追加されるまで、それは動作しませんでしたFlickrAPIRequestsクラスをシングルトンとして設定する手順私は答えを掲載した。それに応じて回答を編集したい場合は、受け入れられた回答を変更することができます。 – fullMoon
これは動作するシングルトンである必要はありませんが、それを処理する方法の1つです。 シングルトンインスタンスがある場合は、コールバックブロック(クロージャ)の使用を検討してください。 ルックアップ;) – silentBob