1

アプリケーションで Alamofire を使用しており、リクエストにエラー (間違った URL など) がある場合にアラートを表示したいと考えています。

アプリケーションのページ間で共有されるため、この関数は別のクラスにあります。

    Alamofire.request(.GET, api_url)
        .authenticate(user: str_api_username, password: str_api_password)
        .validate(statusCode: 200..<300)
        .response { (request, response, data, error) in

            if (error != nil) {
                let alertController = UIAlertController(title: "Server Alert", message: "Could not connect to API!", preferredStyle: UIAlertControllerStyle.Alert)
                alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default,handler: nil))
                self.presentViewController(alertController, animated: true, completion: nil)
            }
    }

Alamofire は非同期で動作するため、エラー チェックをその場で行う必要があります (別の方法で提案しない限り)。結果を操作したいのですが、URL が間違っていた場合は面倒になる可能性があります。

当然のことながら、

self.presentViewController(alertController, animated: true, completion: nil)

このアラートを表示するにはどうすればよいですか?

4

1 に答える 1

2

これに対する従来のアプローチは、このネットワーク要求を呼び出した人がアラートを表示する責任を負うことだと思います。リクエストが完了したときに、元の呼び出し元オブジェクトにコールバックすると、アラートを表示する責任があります。この理由の 1 つは、エラーがさまざまなコンテキストでさまざまなことを意味する可能性があることです。常にアラートを表示したいわけではありません。これにより、アプリを構築する際の柔軟性が向上します。完了時に AlamoFire が応答クロージャーを呼び出すのと同じ方法で、Downloaderオブジェクトでこの呼び出しを開始した人にそれを返すのが最善だと思います。

更新: AlamoFire と同じ方法で構造化する必要があります。AF リクエストが終了したときに呼び出される AF にクロージャーを渡します。

ダウンロード関数にクロージャ パラメータを追加する必要があります (「 」を参照downloadMyStuff)。次に、AF リクエストが終了したら、以前に定義したクロージャーを呼び出すことができます ( completion)。ここに簡単な例があります

class Downloader {
  func downloadMyStuff(completion: (AnyObject?, NSError?) -> Void) {

    Alamofire.request(.GET, "http://myapi.com")
        .authenticate(user: "johndoe", password: "password")
        .validate(statusCode: 200..<300)
        .response { (request, response, data, error) in
            completion(data, error)

      }
  }
}

class ViewController: UIViewController {

let downloader = Downloader()

override func viewDidLoad() {
    super.viewDidLoad()

    self.downloader.downloadMyStuff { (maybeResult, maybeError) -> Void in
        if let error = maybeError {
            println("Show your alert here from error \(error)")
        }

        if let result: AnyObject = maybeResult {
            println("Parse your result and do something cool")
        }
    }

  }
}
于 2014-11-23T14:08:02.683 に答える