Swift:即使文件不存在,downloadTaskWithURL有时会以非零位置“成功”

时间:2016-04-23 05:27:28

标签: ios swift avfoundation nsurlsession nsurlsessiondownloadtask

http://192.168.0.102:3000/p/1461224691.mp4函数有时会返回不存在的文件的非零位置。

测试环境中downloadTaskWithURL处没有文件。

大多数情况下,在此网址上调用downloadTaskWithURL会产生预期的错误消息:

  

在网络运行期间下载消息时出错。下载网址:   http://192.168.0.102:3000/p/1461224691.mp4。位置:零。错误:   可选(错误域= NSURLErrorDomain代码= -1100“请求的URL   在这台服务器上找不到。“UserInfo = 0x17547b640   {NSErrorFailingURLKey = http://192.168.0.102:3000/p/1461224691.mp4,   NSLocalizedDescription =未找到请求的URL   服务器。,   NSErrorFailingURLStringKey = http://192.168.0.102:3000/p/1461224691.mp4})

有时候,location会以非确定的方式认为该文件存在并向fileManager.moveItemAtURL(location!, toURL: fileURL)变量写入内容。结果,保护条件不会失败,代码继续执行......它不应该执行。

downloadTaskWithURL创建的永久文件只有1个字节,确认网络文件从未存在过。

为什么func download() { // Verify <networkURL> guard let downloadURL = NSURL(string: networkURL) where !networkURL.isEmpty else { print("Error downloading message: invalid download URL. URL: \(networkURL)") return } // Generate filename for storing locally let suffix = (networkURL as NSString).pathExtension let localFilename = getUniqueFilename("." + suffix) // Create download request let task = NSURLSession.sharedSession().downloadTaskWithURL(downloadURL) { location, response, error in guard location != nil && error == nil else { print("Error downloading message during network operation. Download URL: \(downloadURL). Location: \(location). Error: \(error)") return } // If here, no errors so save message to permanent location let fileManager = NSFileManager.defaultManager() do { let documents = try fileManager.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false) let fileURL = documents.URLByAppendingPathComponent(localFilename) try fileManager.moveItemAtURL(location!, toURL: fileURL) self.doFileDownloaded(fileURL, localFilename: localFilename) print("Downloaded file @ \(localFilename). Download URL: \(downloadURL)") } catch { print("Error downloading message during save operation. Network URL: \(self.networkURL). Filename: \(localFilename). Error: \(error)") } } // Start download print("Starting download @ \(downloadURL)") task.resume() } 的行为如此?

class CMyUnorderedMap
{

   boost::Unordered_map<TKey,  TValue> m_myMap;
public:
 typename boost::unordered_map<TKey,  TValue>::iterator Begin();

};

template< class Tkey, class Tvalue> 

1 个答案:

答案 0 :(得分:1)

为了澄清一下,服务器返回404,但下载任务是返回一个基本上空的文件?并且您确定服务器实际返回了错误代码(通过验证服务器日志)?

无论哪种方式,我建议检查响应对象中的状态代码。如果它不是200,那么下载任务可能只是下载了错误页面的响应主体。或者,如果状态代码为0,则连接超时。无论哪种方式,都将其视为失败。

您也可以尝试在一个线程上强制执行此操作,并查看非确定性是否消失。