Search code examples
swift3alamofire

Setting Alamofire custom destination file name instead of using suggestedDownloadDestination in Swift 3.0


How to write the following snippet in swift 3.0 ? The following syntax is in swift 2

    Alamofire.download(.POST, invoice.url,parameters:params, destination: { (url, response) -> NSURL in

        let pathComponent = response.suggestedFilename

        let fileManager = NSFileManager.defaultManager()
        let directoryURL = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
        let fileUrl = directoryURL.URLByAppendingPathComponent(pathComponent)
        return fileUrl
    })
    .progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in
        print(totalBytesRead)
        dispatch_async(dispatch_get_main_queue()) {
            let progress = Double(totalBytesRead) / Double(totalBytesExpectedToRead)
            completionHandler(progress, nil)
        }
    }
    .responseString { response in
        print(response.result.error)
        completionHandler(nil, response.result.error)
    }

Solution

  • In Swift 3 it is something like this.

    let parameters: Parameters = ["foo": "bar"]
    
    let destination: DownloadRequest.DownloadFileDestination = { _, _ in
        let pathComponent = "yourfileName"
        let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
        let fileURL = documentsURL.appendPathComponent(pathComponent)
        return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
    }
    
    Alamofire.download(urlString, method: .get, parameters: parameters, encoding: JSONEncoding.default, to: destination)
        .downloadProgress(queue: DispatchQueue.global(qos: .utility)) { progress in
            print("Progress: \(progress.fractionCompleted)")
        }
        .validate { request, response, temporaryURL, destinationURL in
            // Custom evaluation closure now includes file URLs (allows you to parse out error messages if necessary)
            return .success
        }
        .responseJSON { response in
            debugPrint(response)
            print(response.temporaryURL)
            print(response.destinationURL)
        }
    

    Check Alamofire Documentation or Alamofire 4.0 Migration Guide for more details.