gpt4 book ai didi

iOS 后台下载使用 NSURLSessionConfiguration

转载 作者:行者123 更新时间:2023-11-28 11:58:57 26 4
gpt4 key购买 nike

我已经实现了以 20 个为一组下载大小为 1-2 MB 的 block 的代码。 session 完成前 20 个下载请求后,它将在 session 中设置新的 20 个请求。我已经在控制台日志中的真实设备上对其进行了测试,并发现了这一点。

default 15:56:03.627080 +0800   xyz __nw_socket_service_writes_block_invoke sendmsg(fd 14, 31 bytes): socket has been closed
default 15:56:03.671468 +0800 mediaserverd -CMSessionMgr- cmsmHandleApplicationStateChange: CMSession: Client com.xyz with pid '1447' is now Background Suspended. Background entitlement: NO
default 15:56:03.671804 +0800 mediaserverd 1067: pid 1447(xyz)
default 15:56:03.672156 +0800 mediaserverd 3138: sid:0x1a653, xyz(1447), 'prim' new state = Background Task Suspended
default 15:56:03.673578 +0800 locationd Client com.xyz disconnected
default 15:56:03.694200 +0800 symptomsd 1447 com.xyz: BackgroundTaskSuspended (most elevated: BackgroundTaskSuspended)
default 15:56:03.716198 +0800 symptomsd Entry, display name com.xyz uuid 02184FD5-F48B-3EF7-B2B6-98AB05145DB9 pid 1447 isFront 0

有时会遇到这个问题。

Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory" UserInfo={NSErrorFailingURLKey`enter code here`

Code=2 是与设备资源有关的东西。

我的问题是我们可以在下载一批后在后台下载并请求更多文件吗?或者后台模式仅适用于正在进行的请求并暂停应用程序但继续批量下载已发送任务中提到的文件。

这是BG任务的代码,

  if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) {
backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:[[NSBundle mainBundle] bundleIdentifier]];
} else {
backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"downloadmanager"];
}


backgroundConfiguration.discretionary = YES;
backgroundConfiguration.sessionSendsLaunchEvents = YES;
self.backgroundSession = [NSURLSession sessionWithConfiguration:backgroundConfiguration delegate:self delegateQueue:NSOperationQueue.mainQueue];

在 BG 任务中添加 NSURLRequest 的代码,

 NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSessionDownloadTask *downloadTask;
downloadTask = [self.backgroundSession downloadTaskWithRequest:request];

AppDelegate 中的后台任务处理程序

  func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {

DownloadManager.shared().backgroundTransferCompletionHandler = completionHandler
print("background task called")
}

在 BG progress delegate 中发送应用程序后,一段时间后在控制台中停止打印日志。我可以看到它已经部分下载了文件。

- (void)URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {

NSLog(@"Byte downlaoded %lld of %lld ", bytesWritten, totalBytesWritten);

}

最佳答案

在后台队列中下载多个请求太难了。所以我建议你使用 Dispatch Groups。按照以下步骤操作:
第 1 步:您可以将 20 个请求分组在一个 Dispatch Group 中,为了使您的请求平衡,您可以设置每个连接的最大并发请求队列。我认为 2 个并发是每个连接的最佳选择。
第 2 步:当您使用 Dispatch Groups 时。它可以在所有 20 个请求完成后通知,然后您可以为新的 20 个请求创建另一个 Dispatch Groups。

阅读调度组 https://www.allaboutswift.com/dev/2016/7/12/gcd-with-swfit3

关于iOS 后台下载使用 NSURLSessionConfiguration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50406691/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com