2016-05-10 6 views
0

POSTリクエストの 'API'クラスにアクセスするこのような 'ViewController'という単純なUIViewクラスがあるとします。iOS - 別のクラスのcompletionHandlerブロックからビュー関連のクラスにアクセス

@implementation ViewController 
- (void)viewDidLoad { 
    api = [[API alloc] init]; 
    [api postData]; 
} 
@end 

APIクラスは、APIクラスのcompletionHandlerから、私は簡単な警告を表示し(または任意のUIView関連するオブジェクトを変更)するにはどうすればよい

@implementation API 
- (void)postData { 
    [[session dataTaskWithRequest:rq completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

     // show Alert in ViewController if response code is 200 

    }] resume]; 
} 
@end 

NSURLSessionとポストデータを開くのだろうか? 私はブロックの概念ではかなり新しいです。これを解決する最善の方法は何ですか?

よろしくお願いいたします。

答えて

1

これを行うには複数の方法がありますが、完了方法ブロックをpostDataメソッドに追加することができます。次に例を示します。

- (void)postDataWithCompletion:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionBlock { 
    [[session dataTaskWithRequest:rq completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      if (completionBlock()) { 
       completionBlock(data, response, error); 
      } 
     }); 
    }] resume]; 
} 

あなたのビューコントローラに返されたデータを使用することができますので、これは、あなたが完了ハンドラを使用してpostDataメソッドを呼び出すことができます。これは、ブロックを使用する方法の一例に過ぎないことを心に留めておいてください

@implementation ViewController 

- (void)viewDidLoad { 
    api = [[API alloc] init]; 
    [api postDataWithCompletion:^(NSData *, NSURLResponse *, NSError *) { 
     // update your view controller here with the right data 
    }]; 
} 

@end  

- ビューコントローラに生NSDataNSURLSessionオブジェクトを返すことは悪い習慣です、そして:ここではあなたの呼び出しは、あなたのビューコントローラにどのように見えるかですあなたの値をView Controllerにやさしいように変換するAPIレイヤーを書くべきです。

+0

Hmmmこのように、completionHandlerはpostDataWithCompletionメソッドに公開されているため、ViewControllerから取得できます。私はそれを試してみましょう。 Btw、if(completionBlock())はどういう意味ですか? – kaitosenpai

+0

うまくいくはずです。どうしたらいいか教えてください。完了ブロックが存在するかどうかを確認するには、ブロック構文を使用するのが一般的です。多くの場合、メソッドの実装で完了ブロックを無制限に設定することになり、適切に処理しなければクラッシュする可能性があります。保護の問題だけ。 – dokun1

+0

コードが機能しています。デリゲートとプロトコルに精通していますか?あなたはあなたの答えで、この問題を解決する多くの方法があると言いました。おそらく私にデリゲートとプロトコルの別の解決策を教えてもらえますか? – kaitosenpai

関連する問題