0

独自のデリゲートだけを含む新しいファイルを作成して、独自の非同期エンディングを持つ ASIHTTPRequest を作成するにはどうすればよいですか[request setDelegate:self];? [request setDelegate:AlternateDelegate];AlternateDelegate デリゲートを参照する

4

2 に答える 2

1

私はこの質問が古いことを知っていますが、誰かがそれに出くわした場合:

@Hankweb は、リクエストを独自のデリゲートとして使用することについて話しているようです。これが機能する状況は確かにあります。たとえば、ASIHTTPRequestJSON をリモート ソースからフェッチし、Core Data ストアにインポートするために使用するプロジェクトに取り組んでいます。

この操作 (文字通り、ASIHTTPRequestのサブクラスNSOperation) は、ほぼ完全に自己完結型です。バックグラウンド スレッドで、ストリーミング JSON パーサーを使用してオブジェクトを にインポートするカスタム リクエストがありますNSManagedObjectContext。これを保存すると、内部でキャッチし、 を使用してメイン スレッドのコンテキストに渡す通知がトリガーされますperformSelectorOnMainThread:waitUntilDone:

ASIHTTPRequestこれを実現するために のブロック サポートを使用しています。カスタムinitWithURL:メソッドで、関連するコールバック ( dataReceivedBlockcompletionBlockfailureBlockなど) を設定しました。ただし、従来の委任パターン (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 ドキュメントを必ずお読みください。

于 2011-03-14T21:09:12.223 に答える
1

ASIHTTPRequest のデリゲートは、標準的なオブジェクティブ C オブジェクトです。新しいクラスを作成し、そのヘッダーを含め、オブジェクトを作成/取得し、デリゲートをそのオブジェクトに設定するだけです。

これを試して問題が発生しましたか? もしそうなら、何が問題ですか?

于 2010-08-20T09:56:52.820 に答える