我正在努力寻找解决问题的方法,
我有一个下载类来处理对我的 api 的调用,这些调用被添加到 NSOperationQueue。每个呼叫都分配了一个已完成和失败的通知程序,该通知程序在呼叫完成或失败时发布。然后我可以在我的视图控制器中优雅地处理请求的完成/失败。
我遇到的问题是,分配/初始化/释放我的下载类的正确方法是什么。我的第一种方法是这样的:
每次我需要运行请求时,alloc 都会初始化下载类的新实例,然后我可以拥有该类的唯一实例,该实例具有唯一的完整和失败通知程序以及我希望的其他参数。我用这种方法遇到的问题是何时/如何释放对象。我不能简单地调用获取请求,然后在同一个调用中释放对象,因为下载调用有队列要完成和通知要发布,我知道下载类的实例何时完成它的调用,因为通知,我只是不知道从另一个函数释放它的正确方法。例如:
-(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) 次。
我的另一种方法是使用单例下载,这很好,直到我需要将用户信息添加到通知中,这当然会因为从不同地方调用的单例类而变得混乱。
任何帮助将不胜感激,这里是 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];
}