我一直在尝试使用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 ready socket-flow(satisf)]无法使用1帧,标记为失败
2017-06-20 17:22:21.928262 app [4645:1381848] [] nw_endpoint_handler_add_write_request [110.1 10.39.80.102:8550 socket-flow(满意)失败]无法接受写请求
2017-06-20 17:22:21.929278 app [4645:1381027] [] __tcp_connection_write_eof_block_invoke写入关闭回调收到错误:[22]无效参数
我已尝试通过更改URLSessionConfiguration
和timeoutIntervalForRequest
参数来修改我用于执行请求的timeoutIntervalForResource
:
func initManager(timeoutInterval:Double) {
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = timeoutInterval
configuration.timeoutIntervalForResource = timeoutInterval
alamofireManager = Alamofire.SessionManager(configuration: configuration)
}
但是,我仍然遇到同样的问题。有谁知道如何解决这个问题?或者有人面临同样的问题吗?
由于
答案 0 :(得分:1)
您可能正在服务器端达到执行时间限制。也就是说,我认为iOS 10.0 - 10.2.x中的一个错误也可能导致这种不当行为。 (更多https://forums.developer.apple.com/thread/67606。)
即使您解决了这个特定问题的原因,但这里的根本问题是设计问题,而不是请求问题本身。网络不可靠,蜂窝网络也是如此。保持蜂窝连接超过一分钟的几率与赢得彩票的几率大致相同。 (是的,这很夸张,但你明白了。)
我建议采用以下替代方法:
然后,在客户端,您开始上传。如果由于任何原因导致上载失败,则在文件大小端点上发出GET,并发出一个新POST,其偏移量设置为文件长度之后的第一个字节(并且仅提供上载数据的最后一部分) ,显然)。
这可以避免因为iOS中的错误,服务器配置错误或者随机网络故障导致连接失败而丢失上传的单个字节。更好的是,它也可能在NSURLSession的后台上传中可以接受。