iOS:ASIHTTPRequest同步背景选择器坏主意?

时间:2011-04-03 14:54:59

标签: iphone objective-c ios asihttprequest

我在运行后台选择器之前以同步的方式使用NSURLConnection,所以当我转移到ASIHTTPRequest时,我对此框架做了同样的事情。

那么,做以下事情是不是一个坏主意?

// From another method
[self performSelectorInBackground:@selector(callDatasource) withObject:nil];


- (NSData *)callDatasource {

    NSAutoreleasePool *apool = [[NSAutoreleasePool alloc] init];

    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:someURLthatIamusing];
    [request setTimeOutSeconds:50.0];
    [request startSynchronous];
    NSError *error = [request error];
    NSData *returnedData;
    if (!error) {
        returnedData = [request responseData];
    } else {
        // do something with error

    }

    [self performSelectorOnMainThread:@selector(done) withObject:nil waitUntilDone:NO];

    [apool release];

    return returnedData;

}//end

使用ASIHTTPRequest和异步方法以及委托方法有什么好处?

2 个答案:

答案 0 :(得分:2)

根据经验,当在辅助线程上使用ASIHTTPRequest同步请求时,有时会发生奇怪的事情:状态栏中的下载活动图标在下载完成后不会消失,这是我不时注意到的一个问题。我过去没有遇到任何重大问题,但我现在使用异步方法而不是你的方法。 ASI异步方法本质上是一个广泛使用的库,比我自己的实现更加高度测试。

使用异步方法有很多优点 - 你提到了委托方法,但ASI的最新版本实际上也支持块,这是一个很大的飞跃(处理多个同步调用曾经是一点点由于共享的委托方法(或每个异步调用的唯一委托)导致的痛苦。但是使用块你现在可以完全摆脱委托。我发现它们非常有用。另外如果你使用多个贡献者,它可以使可读性更容易。

答案 1 :(得分:0)

此外,通过执行Async,您可以通过setProgressDelegate命令更轻松地跟踪进度。