1

我一直在尝试使用 Alamofire 实现多部分表单数据。我编写了一些代码,它适用于在 60 秒内执行的请求。但是,如果请求超过此值,则它会结束并且上传不会完成:

变量视图

另外,我得到了这个输出(可能意味着我的应用程序正在尝试写入一个关闭的 tcp 套接字):

2017-06-20 17:22:21.924948 app[4645:1381848] [] nw_endpoint_flow_prepare_output_frames [110.1 10.39.80.102:8550 就绪套接字流(满意)] 使用 1 帧失败,标记为失败

2017-06-20 17:22:21.928262 app[4645:1381848] [] nw_endpoint_handler_add_write_request [110.1 10.39.80.102:8550 套接字流失败(满意)] 无法接受写入请求

2017-06-20 17:22:21.929278 app[4645:1381027] [] __tcp_connection_write_eof_block_invoke 写入关闭回调收到错误:[22] 无效参数

我已经尝试通过更改和参数来修改URLSessionConfiguration我用来执行请求的:timeoutIntervalForRequesttimeoutIntervalForResource

func initManager(timeoutInterval:Double) {
    
    let configuration = URLSessionConfiguration.default
    
    configuration.timeoutIntervalForRequest = timeoutInterval
    configuration.timeoutIntervalForResource = timeoutInterval
    
    alamofireManager = Alamofire.SessionManager(configuration: configuration)
}

但是,我仍然遇到同样的问题。有谁知道如何解决这个问题?或者有没有人面临同样的问题?

谢谢

4

1 回答 1

1

您可能会达到服务器端的执行时间限制。也就是说,我认为 iOS 10.0 – 10.2.x 中还有一个错误可能导致这种不当行为。(更多内容请参见 https://forums.developer.apple.com/thread/67606。)

但是,即使您解决了这个特定问题的原因,这里的根本问题是设计问题,而不是请求本身的问题。网络不可靠,蜂窝网络更是如此。保持蜂窝连接超过一分钟的几率与赢得彩票的几率大致相同。(是的,这有点夸张,但你明白了。)

我建议以下替代方法:

  • 一个 POST 或 PUT 端点,它采用文件名、数据流和写入字节的可选偏移量。
  • 一个单独的 POST 端点,用于处理使用上述端点上传的文件。
  • 一个单独的 GET 端点,它返回指定上传文件的当前大小。

然后,在客户端,您开始上传。如果上传因任何原因失败,您在文件大小端点上发出一个 GET,并发出一个新的 POST,偏移量设置为文件长度后的第一个字节(显然只提供上传数据的最后一部分)。

无论连接失败是因为 iOS 中的错误、服务器配置错误还是只是随机网络故障,这都可以避免丢失上传的单个字节。更好的是,它也可以在 NSURLSession 中进行后台上传。

于 2017-06-22T07:34:27.753 回答