4

NSURLConnection リクエストを処理するクラスを構築しています。他のクラスがこのクラスを使用できるようにするには、connectionDidFinishLoading が起動されたときにメイン クラスがデリゲートを呼び出せるようにします。

多くのドキュメントを調べましたが、明確な例を示すものは何も見つかりません。コードは何らかの理由でデリゲートを呼び出していません。私がこれまでに持っているコードは次のとおりです(関連性のないコードは削除されました):

インターフェース:

@interface PDUrlHandler : NSObject {
id delegate;
}
- (void)searchForItemNamed:(NSString *)searchQuery;
@property (nonatomic, assign) id delegate;
@end
@interface NSObject (PDUrlHandlerDelegate) 
- (void)urlHandler:(PDUrlhandler*)urlHandler searchResultsFinishedLoading:(NSDictionary *)resultData;
@end

実装:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSLog(@"Fininshed Loading...");
    resultData = [self parseJSON:jsonData];

    if(delegate && [delegate respondsToSelector:@selector(urlHandler:searchResultsFinishedLoading:)]) {
        NSLog(@"Delegating!");
        [delegate urlHandler:self searchResultsFinishedLoading:resultData];
    } else {
        NSLog(@"Not Delegating. I dont know why.");
    }   

}

他のクラス内のデリゲート:

- (void)urlHandler:(PDUrlhandler*)urlHandler searchResultsFinishedLoading:(NSDictionary *)resultData;
{
    NSLog(@"Delegating!!!!");
}
4

6 に答える 6

4

私の最初の考えは、デリゲートを設定していない可能性があるということでしたが、設定しました。それ以外は、コードは正しいように見えます。何も問題はありません。デリゲートがセレクターに応答するかどうかを確認している場所にブレークポイントを設定しようとしましたか? デリゲート値が保持されず、nil になった可能性があります。デリゲートが nil ではなく、正しいオブジェクトを持っていることを確認してください。

また、接続が非同期であると確信していますか? 同期接続は connectionDidFinishLoading メソッドを呼び出さない

于 2009-01-19T08:30:55.920 に答える
3

この例を見ることに興味がある人のために、アップルのサンプル アプリケーション NSURLCache は、NSURLCacheConnection.m の NSURLConnection の周りに単純なデリゲートを実装しています。

サンプル アプリは、次の Apple Developer Connection から入手できます: http://developer.apple.com/iphone/library/samplecode/URLCache/index.html

私はそれがかなり便利だと思いました。

于 2009-03-20T23:05:57.773 に答える
3

デリゲートを設定するのを忘れていたことが判明しました:

[currentHandler setDelegate:self];

PDUrlHandler への最初の呼び出しを行う行の後に移動する必要があります。

于 2009-01-18T22:12:02.863 に答える
1

あなたは正しい方向に進んでいます。デリゲートパターンを実装する方法は問題ないようです。呼び出されない理由は、respondsToSelectorで間違ったメソッドシグネチャを使用しているためです。あなたがhumidorServer:searchResultsFinishedLoading:実際に欲しいときに持っていますurlHandler:searchResultsFinishedLoading:

于 2009-01-18T20:37:04.927 に答える
0

デリゲートのメソッド名の末尾にあるセミコロンでしょうか (一番右の一番下のコード サンプル)。デリゲートが設定されていて、 -connectionDidFinishLoading: メソッドが呼び出されている場合、何も問題はありません

于 2009-01-18T21:46:12.213 に答える
0

これに「iphone」というタグを付けたので、iPhone アプリで作業していて、10.5 より前の OS X をサポートする必要はないと思います。Objective-C 2.0 では、Apple は、非公式のプロトコルではなく、オプションのメソッドで正式なプロトコル (@protocol を使用) を使用することを提案しています。関連するテキストは次のとおりです。

非公式であるため、カテゴリで宣言されたプロトコルは多くの言語サポートを受けません。オブジェクトがプロトコルに準拠しているかどうかを確認するために、コンパイル時の型チェックも実行時のチェックもありません。これらの利点を得るには、正式なプロトコルを使用する必要があります。デリゲートの場合など、すべてのメソッドがオプションである場合は非公式プロトコルが役立つ場合がありますが、(Mac OS X v10.5 以降では) 通常、オプション メソッドで正式プロトコルを使用する方が適切です。

ソース

于 2009-01-22T19:16:16.897 に答える