简而言之,我正在尝试在WEB上显示一个公开可用的JSON文件中的数据。这一进程如下:
我使用NSURLSessionDataTask启动下载,然后解析并显示JSON或处理错误(如果发生)。这是我的相关代码:
- (void) initiateDownload {
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfig.timeoutIntervalForRequest = 5.0f;
sessionConfig.timeoutIntervalForResource = 20.0f;
NSURLSessionDataTask *downloadWeatherTask = [urlSession dataTaskWithRequest:urlRequest
completionHandler:^(NSData *data, NSURLResponse *response, NSError *downloadError) {
if (downloadError) {
dispatch_sync(dispatch_get_main_queue(), ^{
[self errorReceived:downloadError];
});
} else if (data) {
dispatch_sync(dispatch_get_main_queue(), ^{
[self parseWeatherJSON:data];
});
}
}];
[downloadWeatherTask resume];
}我对此有几个问题:
dispatch_sync(dispatch_get_main_queue() .)
对于这两个完成块,我不确定这是否是线程安全的最佳方法(在此之前,我收到了各种错误消息,在下载完成后10秒就显示了数据)。是否有更好的方法来处理下载,并且线程或我的线程是可接受的解决方案?
NSURLSessionDataTask,并使它在类中的任何地方都可用;因此,每次调用refresh时,我都可以调用resume。但是,我找不到一个命令来重新执行下载过程.一旦我调用了[downloadWeatherTask resume],我就无法从一开始就开始执行任务。因此,我将任务添加到一个单独的函数(您在上面看到的那个函数)中,并在每次调用该函数时在那里初始化它。这很好,但我不确定这是最好的办法。例如,内存安全吗?还是每次用户启动刷新调用并最终耗尽内存时,我都会创建一个新任务?
谢谢你的回答!
更多的信息:我使用最新的XCode 11和目标iOS 9及更高版本。
发布于 2019-10-06 19:18:36
默认情况下,NSURLSession将为完成块使用专用的后台串行队列(如果您这样做,则使用委托方法)。但是,您确实希望确保从主队列(通过dispatch_get_main_queue()检索)触发UI更新。而且您通常希望避免从多个线程中更新属性和ivars (除非它们内置了一些线程安全,这是不寻常的),因此将更新发送回主队列是实现线程安全的一个很好的简单方法。
所以,底线是,你在这里所做的一切都很好。
然而,
无法找到重新执行下载过程的命令.
您只执行(resume)一次给定的任务。如果您想再次执行类似的请求,那么实例化一个新的NSURLSessionDataTask。
https://stackoverflow.com/questions/58259723
复制相似问题