3

ASIHTTPRequest で非同期リクエストを実行しようとしていますが、リクエストが完了したときに通知を受けるのに問題があります。

-(void)doDownload{
    NSURL *url = [NSURL URLWithString:@"http://www.someurl.com/?"];
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    [request setPostValue:@"someValue" forKey:@"someField"];
    [request setRequestMethod:@"POST"];

    [request setDelegate:self];
    [request setDidFinishSelector:@selector(requestFinished)];
    [request startAsynchronous];
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
    // Use when fetching text data
    NSString *responseString = [request responseString];

}

requestFinished が呼び出されることはありません。ASIHTTPRequest.m、-handleStreamCompleted で例外が発生します。

if (fileError) {
    [self failWithError:fileError];
} else {
    [self requestFinished];   <----- this call fails
}

手がかりはありますか?

4

3 に答える 3

7

- (void)requestFinished:(ASIHTTPRequest *)requestリクエストが終了したときに、実装するクラスがまだそこにあると確信していますか? クラスの割り当てが早すぎるように見えます。delegateプロパティはその内容を保持しないことに注意してください。

[self retain]todoDownload[self release]toを追加することもできますが、- (void)requestFinished:(ASIHTTPRequest *)request(!)[self release]頻繁に呼び出されないようにしてください。これは、リクエストが完了しない場合のメモリ リークの可能性もあります。クラスを別の場所に保持するのが最善です。

また、エラーを見つけるためにNSZombieEnabledset を使用してデバッグを試みることもできます。YES

于 2010-01-29T20:48:19.877 に答える
4

あなたのコードの次の行は間違っているようです。

[request setDidFinishSelector:@selector(requestFinished)];

requestFinishedメソッドには引数 (ASIHTTPRequest *) があります。したがって、次のようにセレクターを設定する場合は、「:」
を追加する必要があります。

[request setDidFinishSelector:@selector(requestFinished:)];
于 2010-01-29T21:08:09.143 に答える
0

[リクエスト応答文字列];

この呼び出しの前に、リクエストのretainCountを確認してください。おそらくそれはゼロに等しいでしょう:)もしそうなら、doDownloadメソッドで作成するときにそれを保持することを忘れないでください。

于 2010-01-29T20:45:55.140 に答える