我有一个问题:在“文档”文件夹中下载的音乐长2倍,而且更大。它的比特率也有问题(增加/减少2倍)。图片保存得很好,但是任何音乐都有问题。也许我需要手动设置音频比特率,但是我还没有找到该怎么做的方法。

这是代码:

var file = NSFileHandle()

override func viewDidLoad() {
    super.viewDidLoad()

}

@IBAction func touchBut(sender: UIButton) {
    var items = NSMutableArray()
    var path: String = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0].stringByAppendingPathComponent("mus4.mp3")
    var err: NSError?
    if NSFileManager.defaultManager().fileExistsAtPath(path) {
        dump(path)
        println("already be")
    } else {
        var url = NSURL(string: "http://data.iplayer.fm/file/ia76k50/104678741/177398297/Sayyod_-_Kerakmas_(iPlayer.fm).mp3")!
        var request = NSURLRequest(URL: url)
        var connection = NSURLConnection(request: request, delegate: self)
        if (connection != nil) {
            NSFileManager.defaultManager().createFileAtPath(path, contents: nil, attributes: nil)
            self.file = NSFileHandle(forUpdatingAtPath: path)!
        }
        println("ok")
    }
}

func connection(connection: NSURLConnection, didReceiveData data: NSData) {
    UIApplication.sharedApplication().networkActivityIndicatorVisible = true
    file.seekToEndOfFile()
    var receivedData: NSMutableData = NSMutableData(data: data)
    receivedData.appendData(data)
    file.writeData(receivedData)
}

func connectionDidFinishLoading(connection: NSURLConnection) {
    file.closeFile()
    UIApplication.sharedApplication().networkActivityIndicatorVisible = false
}

func connection(connection: NSURLConnection, didFailWithError error: NSError) {
    println(error)
    file.closeFile()
    UIApplication.sharedApplication().networkActivityIndicatorVisible = false
}

附言我是新手

最佳答案

我真的很使用rust (多年来没有回答任何问题,我不得不从编码中休息一下),但是看起来您正在使用另一个数据对象(data)的内容创建一个数据对象(receivedData),并且然后将源数据对象(数据)的内容添加到新对象(receivedData)中-如果听起来有些混乱,那是因为:

    ...
    var receivedData: NSMutableData = NSMutableData(data: data)
    receivedData.appendData(data)
  • 您将通过使用“data”参数的内容对其进行初始化来创建“receivedData”对象。结果是,您基本上已经将“数据”对象的内容复制到了“receivedData”对象中。
  • 之后,将数据从“数据”参数附加到“receivedData”。由于初始化“receivedData”的方式,由于“receivedData”已经包含“data”对象的内容,因此“receivedData”对象最终将“data”的内容复制了两次。

  • 用简单的英语来说,文件的长度是预期长度的两倍,这是因为文件的长度是预期长度的两倍。您正在从另一个数据块创建一个数据块,然后将同一数据块添加回自身。

    尝试以下方法:
        ...
        // Delete the previous two lines
        file.writeData(data)
    

    完成后,您应该具有以下功能:
    func connection(connection: NSURLConnection, didReceiveData data: NSData) {
        UIApplication.sharedApplication().networkActivityIndicatorVisible = true
        file.seekToEndOfFile()
        file.writeData(data)
    }
    

    只要以上代码都能正常工作(提醒:我已经离开游戏了一段时间了,而且我是Swift的新手),那么您的文件应该是您期望的大小。

    如果代码不起作用,我希望解释能帮助您理解为什么您的代码生成的文件的大小是原来的两倍。

    另外,这有点题外话,请考虑重新考虑networkActivityIndi​​cator代码。当您开始下载时,请打开指示灯,然后在下载完成或失败时将其关闭。

    祝好运 :)

    09-04 01:47