1

リクエストとデータ処理(解析)を行う独自のクラスがあります。このクラスは、さまざまなビュー コントローラーから使用する必要があります。このクラスでは、次を実装しました。

- (void)sendRequest:(NSString *)url;
- (void)requestFinished:(ASIHTTPRequest *)request;
- (void)requestFailed:(ASIHTTPRequest *)request;
- (id)parse:(NSString *)aString;

result というプロパティを作成しました。リクエストが到着すると、requestFinished が呼び出されます。requestFinished では、結果が result に保存されます。sendRequest で値を返すと結果が返ってくると思いました。しかし、前に述べたように、requestFinished は結果を取得するため、sendRequest は常に nil 変数を返します。その時点ではリクエストは完了していないためです。

結果を返すにはどうすればよいですか? このクラスをさまざまなビュー コントローラーから使用できるようにしたいと考えています。したがって、ビュー コントローラーでメソッドを作成して結果を渡す最初の考えは機能しません。

ビューコントローラーをデリゲートとして使用することについて、このスレッドPass Result of ASIHTTPRequest "requestFinished" Back to Originating Methodを読みました。しかし、ビューコントローラーに requestFinished と requestFailed を実装する必要があると思います。異なるView Controllerに重複するコードを持たないという考えはなくなります...

誰か助けてくれませんか?

4

1 に答える 1

0

だから最後に私はデリゲートでそれをしました。

私の抽象化クラス (*.h) では、次のように定義しました。

警告: '-setDarkness:' メソッドが見つかりません

警告: (一致するメソッド署名のないメッセージは想定されます

警告: 'id' を返して '.. .' を受け入れる 引数として。)

@protocol RssParserDelegate <NSObject>  
    - (void)displayResults:(NSDictionary *)parserResults;
@end

抽象化クラス (*.h) でインスタンス変数といくつかのメソッドを宣言したよりも:

id _delegate;
// ...
- (id)delegate;  
- (void)setDelegate:(id)new_delegate;

したがって、宣言は (*.m) のようになります。

 - (id)delegate {  
     return _delegate;  
 }  

 - (void)setDelegate:(id)new_delegate {  
     _delegate = new_delegate;  
 }

結果を渡すには、requestFailed と requestFinished に次のコードを追加する必要があります。

if ([_delegate respondsToSelector:@selector(displayResults:)])
    [_delegate displayResults:results];
else  
{   
    [NSException raise:NSInternalInconsistencyException  
                format:@"Delegate doesn't respond to displayResults:"];  
}

sendRequest を再定義し、着信デリゲートをインスタンス変数に設定しました。

- (void)sendRequest:(NSString *)url withDelegate:(id)aDelegate {
    // set delegate to populate the results later
    [self setDelegate:aDelegate]; 

ビュー コントローラーで、このメソッドを宣言します。

- (void)displayResults:(NSDictionary *)results {
     // do some data processing
     ...
     // show data
     [self.tableView reloadData];
}

また、抽象化クラスのメソッド呼び出しを sendRequest に変更しました。

[yourRequest sendRequest:@"xxx" withDelegate:self]; 
于 2010-09-03T11:57:27.350 に答える