2017-06-20 210 views
1

我一直在尝试使用Alamofire实现多部分表单数据。 我做了一些代码,它适用于执行时间低于60秒的请求。但是,如果请求花费不止于此,它结束并上传未完成:MultipartFormData上传使用Alamofire

Variables view

而且,我得到这个输出(大概意思是说我的应用程序试图写一个封闭的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 (satisfied)] Failed to use 1 frames, marking as failed

2017-06-20 17:22:21.928262 app[4645:1381848] [] nw_endpoint_handler_add_write_request [110.1 10.39.80.102:8550 failed socket-flow (satisfied)] cannot accept write requests

2017-06-20 17:22:21.929278 app[4645:1381027] [] __tcp_connection_write_eof_block_invoke Write close callback received error: [22] Invalid argument

我已经尝试修改URLSessionConfiguration我使用通过改变timeoutIntervalForRequesttimeoutIntervalForResource参数执行请求:

func initManager(timeoutInterval:Double) { 

    let configuration = URLSessionConfiguration.default 

    configuration.timeoutIntervalForRequest = timeoutInterval 
    configuration.timeoutIntervalForResource = timeoutInterval 

    alamofireManager = Alamofire.SessionManager(configuration: configuration) 
} 

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

谢谢

回答

1

您可能正在执行服务器端的执行时间限制。也就是说,我认为iOS 10.0 - 10.2.x中也存在一个可能导致这种不良行为的错误。 (更多文章https://forums.developer.apple.com/thread/67606。)

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

我建议以下替代方法:

  • 一个POST或PUT端点一个文件名,数据流,以及一个可选的偏置在哪写字节。
  • 一个单独的POST端点,用于处理使用上述端点上载的文件。
  • 一个单独的GET端点,返回指定上传文件的当前大小。

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

这样可以避免由于iOS中的错误,服务器配置错误或只是随机网络故障导致连接失败,从而导致丢失单个字节的上传。更好的是,它也可以在NSURLSession中以后台上传的方式工作。

+0

谢谢@dgatwood。我完全忘了回答你。你是对的,我在服务器端达到了执行时间限制(定义为60秒)。此外,你的建议是相当不错的,我已经定义了一个任务来实现它(因为我使用的服务器支持正确执行)。 –

相关问题