我一直在开发一个允许下载大文件的应用程序。我正在使用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
下载将在后台继续,完成后将触发完成回调。但由于这些错误,似乎没有调用进程回调,除非我关闭应用程序并再次打开它并在打开时重新加载表格单元格视图。
我无法在网上找到有关这类错误的更多信息,只有隐藏错误的信息才能打印到控制台。
有人可以帮忙吗?
由于
答案 0 :(得分:0)
我尝试使用Alamofire下载大文件(800 MB aprox)时遇到了同样的问题。起初我的实现是调用 validate(),然后是 responseData(queue:completionHandler:)。
当发生此错误时,Alamofire将其视为一个失败的 alamofire.AFError.ResponseValidationFailureReason.dataFileNil (没有 resumeData ),这表明关闭已发送到参数为nil,这不是我的情况。
所以我的解决方案是删除 validate()调用并通过捕获交换机上的状态代码手动进行验证。
现在没有 validate()调用Alamofire捕获了与失败相同的错误,但是状态代码为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
}
如果您需要更多信息/详情,请告诉我