iOS ARC Fire and Forget ASYNC Wrappers的最佳实践



我有一个相当简单的NSURLConnectionDelegate包装器类,用于处理应用程序的简单HTTP请求。

当这些请求返回时,它们会调用主视图控制器类中的后续委托方法,以通知我结果是否成功。

如果我在我的视图控制器中的一个方法中使用这些包装器,采用即发即弃方法,如:

- (void) Foo {
    MySimpleRequest* request = [[MySimpleRequest alloc] initWithDelegate:self];
    [request send];
}

一旦Foo的退出,request似乎就会被ARC清除,并且以后的委托方法永远不会被调用。

如果我将request指针移动到类级别,它就会挂起并成功。

这是推荐的方法吗?我是否必须让成员vars保留每个请求,或者有没有一种方法可以在请求返回之前保持其生命周期?

您可以使用一个块从下载中返回数据,并让downloader类作为下载的委托,这样所有的委托方法都可以包含在该类中。我使用一个处理NSURLConnection的类,并从didFailWithError或connectionDidFinishLoading调用完成块:。下载程序类在执行块之后被解除分配。我从视图控制器这样称呼它,

    Downloader *dl = [Downloader new];
    NSURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.wswd.net/testdownloadfiles/20MB.zip"]] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10];
    [dl downloadWithRequest:request completion:^(NSData *data, NSError *error) {
        if (data) {
            // do whatever you need to do with the raw data here
            NSLog(@"got the data");
        }else{
            NSLog(@"%@",error);
        }
    }];

我希望始终保留对请求的"外部"引用。如果您不希望这样,我认为您可以在MySimpleRequest类中创建一个对self的强引用。

请确保将其设置为零,否则很明显会出现内存泄漏。

最新更新