在objective-c中,后台线程中的递归方法是否正确



我正在尝试以下代码,在后台线程中从服务器加载一个文件。如果它加载失败,然后再次调用相同的方法,这是在后台线程中再次调用它的正确方法吗?

[self performSelectorInBackground:@selector(loadFileFromServer:) withObject:nil];
int retryCount = 0;
- (void)loadFileFromServer{
FetchServerFile *fetchF = [FetchServerFile new];
[fetchF fetchFile:^(BOOL OK){
if(OK){
[self toStart];
}
else{
retryCount++;
if(retryCount<3){
[self performSelectorInBackground:@selector(loadFileFromServer:) withObject:nil];
}
else{
[self exitLogic];
}
}
}];
}

关于performselectorinbackground:withObject:的使用,文档告诉我们:

此方法在应用程序中创建一个新线程,如果应用程序还没有进入多线程模式,则将其置于多线程模式。aSelector表示的方法必须像设置程序中的任何其他新线程一样设置线程环境。有关如何配置和运行线程的更多信息,请参阅《线程编程指南》。

如果你想在后台线程上运行一些代码,只使用Grand Central Dispatch会更容易(也更高效(。

话虽如此,这就引出了一个问题,为什么你要把它推到后台线程。网络代码通常异步运行,在这种情况下,在后台线程上运行此代码没有什么意义。这只会使局势复杂化。

关于重试逻辑的细节,这取决于目的。一些应用程序使用其中一个"可达性"库,在用户未连接到网络时主动警告用户,但在这种情况下,您本身不会使用重试逻辑,而是只需要一个在网络重新建立后调用的处理程序。

重试逻辑似乎也必须包含在请求的末尾(检查请求是否成功(,而不是启动请求的起始处。

此外,如果你只是想执行一些简单的上传和下载,你可能需要考虑使用后台URLSessionConfiguration,因为它可以处理各种问题(例如连接问题、用户在上传/下载完成前离开应用程序等(

最新更新