2

NSInvocationTL;DR バージョン: Swift で引数を含むメソッド呼び出しをパッケージ化するための最も近い同等または同様の方法は何ですか?

背景: ServerControllerAPI へのリクエストを行うためにアプリ全体で使用されるオブジェクトがあります。この方法で魔法が起こります。

    private func makeRequestWithPath(
            path: String,
            method: String = "GET",
            body: NSData? = nil,
            successBlock: (AnyObject?) -> Void) {  
// ...
            self.urlSession.dataTaskWithRequest(request,
               completionHandler: { (data, resp, error) -> Void in

                 if let httpResp = resp as? NSHTTPURLResponse {

                     switch httpResp.statusCode {

                         case 200:
                             successBlock(/* pass process response in here */)

                         case 401:
                             self.postNotificationOnMainThread(kAppTokenRefreshRequiredNotification)

// ...
            }.resume()

定期的に API リクエストが 401 で失敗し、通知としてアプリでブロードキャストされます。これは、多くの関係者がリクエストにもう少し時間がかかるという事実に関心があるためです。別の API 要求を使用してアプリ トークンを更新すると、他の API 要求が再び機能し始めます。

これは私が助けを必要としている部分です:次に、再認証後に元の API リクエストを繰り返す必要があります。

以前の Objective-C では、NSInvocationオブジェクトを使用して元のメソッド呼び出しをパッケージ化していた可能性がありますが、これは Swift では利用できないため、より Swift に似たアプローチが必要であると考えています。しかし、私はまだそれを理解することができませんでした。

これまでに思いついた最善のアプローチは次のとおりです。

  • への参照とともに引数をディクショナリに入れ、それらをパラメータServerControllerとして通知に渡しますobject:
  • 通知オブザーバーで (再承認の完了後)、引数を辞書から取り出し、同じメソッドを手動で再度呼び出して要求を繰り返します。

これは次善の解決策のように思われ、より良い方法が必要です。

4

0 に答える 0