[ヘッダ] ExNSURLConnection.h (ヘッダの名前はNSURLConnectionの拡張なのでExと付けてみました。何でもいいです。)
// ①②のコールバックメソッドからブロック型を定義します。型名はdidiReceiveDataとdidOccuerErrorにしてみました
// OnReceiveDataやOnOccurErrorとかでも良さそうです
typedef void (^didReceiveData)(NSData *data);
typedef void (^didOccurError)(NSError *error);
@interface ExNSURLConnection : NSURLConnection
{
didReceiveData didReceiveData_; // ブロックを保持するインスタンス変数です
didOccurError didOccurError_; // 変数名は工夫してもいいですが、機械的に「型名_」にしました
}
// コンストラクタです。ここでブロック変数を利用者から渡して貰いましょう。(コンストラクタ以外のメソッドから貰っても良いです)
+ (id)startWithRequest:(NSURLRequest *)request
didReceiveData:(didReceiveData)didReceiveData
didOccurError:(didOccurError)didOccurError;
@end
[実装] ExNSURLConnection.m
@implementation ExNSURLConnection
// 利用者に提供するコンストラクタです。その下のinitWithRequestを呼び出すだけのstaticメソッドです
+ (id)startWithRequest:(NSURLRequest *)request
didReceiveData:(didReceiveData)didReceiveData
didOccurError:(didOccurError)didOccurError
{
return [[SOFURLConnection alloc] initWithRequest:request
didReceiveData:didReceiveData didOccurError:didOccurError];
}
// コンストラクタ本体です
- (id)initWithRequest:(NSURLRequest *)request
didReceiveData:(didReceiveData)didReceiveData
didOccurError:(didOccurError)didOccurError
{
// まず本来のNSURLConnectionのコンストラクタを呼び出します。(super)
// delegate引数には自身(self)を指定します。
// 利用者のブロックオブジェクトをcopyしてインスタンス変数に保持します。
if (self = [super initWithRequest:request delegate:self startImmediately:NO]) {
didReceiveData_ = [didReceiveData copy];
didOccurError_ = [didOccurError copy];
}
return self;
}
// ①のコールバックメソッドが呼ばれたら、ブロック呼び出しに置き換えます
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
didReceiveData_(data);
}
// ②のコールバックメソッドが呼ばれたら、ブロック呼び出しに置き換えます
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
didOccurError_(error);
}
@end