独自のデリゲートだけを含む新しいファイルを作成して、独自の非同期エンディングを持つ ASIHTTPRequest を作成するにはどうすればよいですか[request setDelegate:self];
? [request setDelegate:AlternateDelegate];
AlternateDelegate デリゲートを参照する
2 に答える
私はこの質問が古いことを知っていますが、誰かがそれに出くわした場合:
@Hankweb は、リクエストを独自のデリゲートとして使用することについて話しているようです。これが機能する状況は確かにあります。たとえば、ASIHTTPRequest
JSON をリモート ソースからフェッチし、Core Data ストアにインポートするために使用するプロジェクトに取り組んでいます。
この操作 (文字通り、ASIHTTPRequest
のサブクラスNSOperation
) は、ほぼ完全に自己完結型です。バックグラウンド スレッドで、ストリーミング JSON パーサーを使用してオブジェクトを にインポートするカスタム リクエストがありますNSManagedObjectContext
。これを保存すると、内部でキャッチし、 を使用してメイン スレッドのコンテキストに渡す通知がトリガーされますperformSelectorOnMainThread:waitUntilDone:
。
ASIHTTPRequest
これを実現するために のブロック サポートを使用しています。カスタムinitWithURL:
メソッドで、関連するコールバック ( dataReceivedBlock
、completionBlock
、failureBlock
など) を設定しました。ただし、従来の委任パターン (ASIHTTPRequestDelegate
プロトコルを使用) も機能するはずです。
1 つの落とし穴: 要求が何度も保持されないようにする必要があります。そうしないと、メモリ リークが発生します。これは、複数のスレッドを使用している場合、特にブロックを使用している場合に見逃されがちです。それ以外の:
- (id)initWithURL:(NSURL *aURL) {
//...
[self setCompletionBlock:^{
[self doSomething];
}];
//...
return self;
}
ブロック内で参照する場合は、属性を使用し__weak
ます (または、 ARC を使用し__block
ていない場合)。self
- (id)initWithURL:(NSURL *aURL) {
//...
__weak id blockSelf = self;
[self setCompletionBlock:^{
[blockSelf doSomething];
}];
//...
return self;
}
これが重要な理由がわからない場合は、Apple の Objective-C のブロックに関するガイドとASIHTTPRequest ブロック API ドキュメントを必ずお読みください。
ASIHTTPRequest のデリゲートは、標準的なオブジェクティブ C オブジェクトです。新しいクラスを作成し、そのヘッダーを含め、オブジェクトを作成/取得し、デリゲートをそのオブジェクトに設定するだけです。
これを試して問題が発生しましたか? もしそうなら、何が問題ですか?