NSURLConnectionのラッパーであるクラスを作成し、接続のさまざまな段階で呼び出されるクラスパスブロックのユーザーを作成しました。ラッパークラスを以下に示します。簡潔にするために省略します。
typedef void (^ConnectionFinishedWithErrorBlock)(NSError* error);
@interface MYHTTPConnection : NSObject <NSURLConnectionDelegate>
@property (copy, nonatomic) ConnectionFinishedWithErrorBlock theErrorBlock;
@property (strong, nonatomic) NSURLConnection *connection;
- (void) establishConnectionForURL:(NSURL*) url
andConnectionFinishedWithErrorBlock: (ConnectionFinishedWithErrorBlock) errorBlock;
@end
これまで、インラインで宣言されたブロックで使用してきました。
[self.httpConnection establishConnectionForURL: url
andConnectionFinishedWithErrorBlock:^(NSError* error)
{
...
}];
しかし、今では非常に長いエラー処理ブロックがあり、そのすべてのコードをインラインに配置すると面倒になります(APIはここに示されていない他のブロックを使用するため)。
私はこのようなことをすることができることを知っています:
void (^httpConnectionFinishedWithError)(NSError*) =
^(NSError* error)
{
}
次に、httpConnectionFinishedWithErrorを渡して、ConnectionForURLを確立します。ただし、httpConnectionFinishedWithErrorにはselfへの呼び出しが含まれています。ブロックがインラインで宣言されている場合、selfの呼び出しは問題ありませんが、上記のように行われた場合は、明らかにコンパイルエラーが発生するため、問題ありません。
だから私は、ブロックを呼び出し元のクラスのブロックプロパティにすることができるかどうか/どのようにできるのか疑問に思いましたか?(上記のMYHTTPConnectionクラスで行われているように、以前はブロックをクラスのプロパティとして使用しましたが、この状況では、establishConnectionForURLに渡されるブロックをのプロパティとして追加する構文を正しく取得できません。呼び出し元のクラス)。
または、httpConnectionFinishedWithErrorで別の関数を呼び出すこともできますが、その場合、selfをパラメーターとして渡す必要があります。この場合、ブロック内でselfを取得するにはどうすればよいですか。
他にもっとエレガントな解決策はありますか?
どうもありがとう
編集:コンパイルエラーの例を示すために更新されました
void (^httpConnectionFinishedWithError)(NSError*) =
^(NSError* error)
{
self.boolProperty = NO; // here
}