1

我一直在开发一个允许下载大文件的应用程序。我正在使用 Swift 3 和 Alamofire,

下载在后台运行,在 iOS 10.2.x 上,这一切都运行良好。但是在设备切换到睡眠状态时更新到 iOS 10.3.x 时,再次打开应用程序时会引发以下错误:

[] nw_socket_get_input_frames recvmsg(fd 6, 1024 bytes): [57] Socket is not connected
[] nw_endpoint_handler_add_write_request [1.1 192.124.249.2:443 failed socket-flow (satisfied)] cannot accept write requests
[] tcp_connection_write_eof_block_invoke Write close callback received error: [22] Invalid argument

下载在后台继续,完成后将触发完成回调。但是由于这些错误,似乎没有调用进度回调,除非我关闭应用程序并再次打开它并在打开时重新加载表格单元格视图。

我在网上找不到很多关于这类错误的信息,只有关于隐藏错误以防止打印到控制台的信息。

任何人都可以帮忙吗?

谢谢

4

1 回答 1

0

我在尝试使用 Alamofire 下载大文件(大约 800 mb)时遇到了同样的问题。起初我的实现是调用validate()然后responseData(queue:completionHandler:)

发生此错误时,Alamofire 将其捕获为失败,并带有alamofire.AFError.ResponseValidationFailureReason.dataFileNil(没有resumeData),这表明在to参数上发送的闭包为 nil,这不是我的情况。

所以我的解决方案是删除validate()调用并通过捕获开关上的状态代码手动进行验证。

现在没有validate()调用,Alamofire 捕获了与 Failure 相同的错误,但状态代码为 200 和resumeData。发生这种情况时,我只是再次进行下载,但这次在下载调用中发送 resumeData。由于 resumeData 几乎为 100%(因为错误发生在 Alamofire 尝试写入文件时,在下载结束时),第二次下载非常短。

所以基本上我的代码看起来像这样:

switch response.response?.statusCode {
    // other cases
    case 200:
        if let resumeData = response.resumeData {
           // failed
           // retry the download using resumeData
        } else {
           // succeed finished download
        }
   // more cases
}

如果您需要更多信息/详细信息,请告诉我

于 2017-08-21T04:49:06.610 回答