2

我正在努力寻找解决问题的方法,

我有一个下载类来处理对我的 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];

}
4

2 回答 2

2

队列应该是处理对象释放的队列。这里有几个选项。

  1. 您可以使用 NSNotification 发布您的最终状态,队列会监听并删除发送该通知的实例

  2. 您可以在通知队列的下载和队列之间创建私人委托

  3. 您可以在 Download 类(即BOOL completed)中设置布尔型 @property。该队列保留了下载实例并在 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 回答