2

私は自分の問題の解決策を見つけるのに苦労しています、

APIへの呼び出しを処理するDownloadクラスがあり、これらの呼び出しはNSOperationQueueに追加されます。各呼び出しには、呼び出しが完了または失敗したときに投稿する、完了および失敗した通知機能が割り当てられます。その後、ViewControllerでリクエストの完了/失敗を適切に処理できます。

私が抱えている問題はこれです。ダウンロードクラスをalloc/init/releaseする正しい方法は何ですか。私の最初のアプローチは次のようなものでした。

リクエストを実行する必要があるたびに、ダウンロードクラスの新しいインスタンスを割り当てます。そうすれば、必要に応じて、一意の完全な通知機能と失敗した通知機能、およびその他のパラメータを使用して、クラスの一意のインスタンスを作成できます。このアプローチで私が抱えていた問題は、いつ/どのようにオブジェクトを解放するかです。ダウンロード呼び出しには完了キューと投稿通知があるため、単純にフェッチ要求を呼び出してから同じ呼び出し内でオブジェクトを解放することはできません。ダウンロードクラスのインスタンスが通知のために呼び出しを終了したときはわかります。別の関数からのリリースを実装する正しい方法がわかりません。例えば:

-(void)downloadLists:(int)page featured:(BOOL)featured {

    NSMutableDictionary *postValues = [NSMutableDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:page],@"page",@"false",@"is_featured", nil];

    if(featured){
        [postValues setValue:@"true" forKey:@"is_featured"];
    }

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *destination = [[paths objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"lists_%i.json",page]];

    Download *download = [[Download alloc] init];
    [download setCompleteNotifier:@"listsComplete"];
    [download setFailedNotifier:@"listsFailed"];
    [download downloadPOST:[NSURL URLWithString:@"http://blahblah"] values:postValues destination:destination];

}

次に、ダウンロードをどこでリリースし、正しいインスタンスをリリースしていることを確認すると、downloadListsが(n)回連続して呼び出される場合があります。

私の他のアプローチは、ダウンロードのシングルトンを使用することでした。これは、通知にuserinfoを追加する必要があるまでは素晴らしかったですが、もちろん、さまざまな場所から呼び出されるシングルトンクラスによって混乱しました。

どんな助けでも大歓迎です、ここにあなたの参照のためのdownloadPOST関数があります:

-(void)downloadPOST:(NSURL *)path values:(NSDictionary *)keyValues destination:(NSString *)destination {

    ASIFormDataRequest *formRequest = [ASIFormDataRequest requestWithURL:path];

    for(id key in keyValues){
        [formRequest setPostValue:[keyValues objectForKey:key] forKey:key];
    }

    [formRequest setDownloadDestinationPath:destination];
    [formRequest setDelegate:self];
    [formRequest setDidFinishSelector:@selector(requestDone:)];
    [formRequest setDidFailSelector:@selector(requestWentWrong:)];
    [queue addOperation:formRequest];

}
4

2 に答える 2

2

キューは、オブジェクトのリリースを処理するキューである必要があります。ここにはいくつかのオプションがあります。

  1. NSNotificationを使用して、キューがリッスンする最終状態を公開し、その通知を送信するインスタンスを削除できます。

  2. ダウンロードとキューの間にプライベート委任を作成して、キューに通知を受け取ることができます

  3. ダウンロードクラス(つまり)にブール値の@propertyを設定できますBOOL completed。キューはダウンロードインスタンスを保持し、完了したKVCにリスナーを追加します。完了がYESに設定されている場合、オブジェクトを解放します

AFAK、あなたはそれをすべて処理するASIHTTPRequestを使用しているので、なぜこれをやり直すのかわかりません

于 2011-05-18T12:34:00.960 に答える
0

デフォルトでASIHTTPRequestにすでに含まれている機能をラップしているようです。ASIクラスには、完了または失敗を通知するためのデリゲートが組み込まれています。

- (void)requestFinished:(ASIHTTPRequest *)request;
- (void)requestFailed:(ASIHTTPRequest *)request;

ダウンロードクラスを作成せずにメインクラスでリクエストを作成し、それが完了したときにデリゲートに通知することができない他の理由はありますか?

于 2011-05-19T05:00:02.723 に答える