プロトコルを実装する専用のクラス (UIViewController クラスではない) があるNSURLConnectionDelegate
場合は、メソッドの UI 要素を変更しないでくださいconnectionDidFinishLoading:
。このメソッドは、「接続」クラスの「内部」使用のためのものです。
必要なのは、「接続」オブジェクトからリクエストの最終的な結果を取得する方法です。つまり、応答データまたは - おそらく - エラーです。
これを実現する 1 つの方法は、「接続」クラスに完了ブロックを受け取るプロパティを提供することです。このブロックは、接続が終了したときにクラスによって呼び出されます。
typedef void (^completion_block_t)(id result);
@property (nonatomic, copy) completion_block_t completionHandler;
次に、接続が(何らかの理由で)終了するたびに、応答データ(おそらくNSMutableData
蓄積されたデータチャンクを含む)またはNSError
接続から取得したオブジェクトまたは自分で作成したオブジェクトのいずれかである結果でブロックを呼び出します-たとえば、正しい Content-Type を取得できなかった、または接続が実際に終了したときに、ステータス コードがアプリのロジックで要求が成功したことを意味するわけではありません。
View Controller での使用方法の例:
// somewhere in your UIViewController:
MyConnection* con = [[MyConnection alloc] initWithRequest:request];
__weak MyViewController* weakSelf = self; // idiom to avoid circular references
con.completionHandler = ^(id result){
if (![result isKindOfClass:[NSError error]]) {
// do something with the response data:
NSString* string = [[NSString alloc] initWithData:result
encoding:NSUTF8StringEncoding];
dispatch_async(dispatch_get_main_queue(), ^{
// UIKit methods:
weakSelf.myLabel.text = string;
});
}
else {
// Error
}
};
// Start the connection:
[con start];