私は自分の問題の解決策を見つけるのに苦労しています、
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];
}