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>
答案 0 :(得分:1)
为了澄清一下,服务器返回404,但下载任务是返回一个基本上空的文件?并且您确定服务器实际返回了错误代码(通过验证服务器日志)?
无论哪种方式,我建议检查响应对象中的状态代码。如果它不是200,那么下载任务可能只是下载了错误页面的响应主体。或者,如果状态代码为0,则连接超时。无论哪种方式,都将其视为失败。
您也可以尝试在一个线程上强制执行此操作,并查看非确定性是否消失。