swift - URLSession dataTask 方法返回 0 字节数据

标签 swift alamofire nsurlsession

我正在使用带有完成处理程序的 URLSession 的 dataTask 方法。响应中的错误是 nil,但是数据对象返回了一些东西,它返回了 0 个字节的数据。

我首先使用的是 Alamofire 库,我认为它有问题,因为我开始使用较新的版本,所以我声明使用我自己的 Alamofire 实现,这样我就不必重写我已经拥有的所有调用应用程序。

它仍然返回 0 字节的数据。

当我通过简单的 URLSession 调用在 Playground 中使用相同的 URL 时,它可以正常工作并返回数据,您知道可能会出现什么问题吗?

我的 Alamofire 实现(在 30 分钟内非常快速和肮脏):

import Foundation

typealias DataResponse = (data: Data?, response: URLResponse?, error: Error?, request: URLRequest?, result: Result)

public class Alamofire: NSObject {

    enum Method: String {
        case get = "GET"
        case post = "POST"
    }

    fileprivate static let session = URLSession(configuration: URLSessionConfiguration.default)

    public struct request {
        var request: URLRequest? = nil
        var url: URL? = nil
        let method: Alamofire.Method?
        let parameters: Parameters?
        let headers: Headers?

        init(_ request: URLRequest, method: Alamofire.Method? = nil, parameters: Parameters? = nil, headers: Headers? = nil) {
            self.request = request
            self.url = request.url
            self.method = method
            self.parameters = parameters
            self.headers = headers
        }

        init(_ url: URL, method: Alamofire.Method? = nil, parameters: Parameters? = nil, headers: Headers? = nil) {
            self.url = url
            self.request = URLRequest(url: url)
            self.method = method
            self.parameters = parameters
            self.headers = headers
        }
    }
}

typealias Parameters = [String: Any?]
typealias Headers = [String: String]

extension Alamofire.request {

    func responseData(completionHandler: @escaping (_ dataResponse: DataResponse) -> Void) {
        guard let request = request else { return }

        Alamofire.session.dataTask(with: request) { (data, response, error) in
            let result: Result
            if let error = error {
                result = Result.failure(error)
                completionHandler((data, response, error, request, result))
                return
            }

            completionHandler((data, response, error, request, Result.success))
        }.resume()
    }   
}

enum Result {
    case success
    case failure(Error)
}

最佳答案

所以我的问题的解决方案是意识到数据提供者切断了我的数据 :) 也可能发生。这可能不是一个“解决方案”,而是一个你必须考虑的选项,因为我将从现在开始 :D 谢谢大家

关于swift - URLSession dataTask 方法返回 0 字节数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48172103/

相关文章:

ios - 在 ios swift 中使用 alamofire 请求超时错误 1001?

nsurlsession - 在 kCFStreamErrorDomainSSL 上中断

ios - 如何使用 swift 在数组中字符串的开头和结尾添加带双引号的字符串

ios - Swift 3 CGContext 内存泄漏

ios - 从类型 '(_, _) throws -> ()' 的抛出函数到非抛出函数类型 '(JSON?, Error?) -> Void' 的无效转换

ios - Alamofire POST 错误请求

objective-c - 使用 Jastor 将 JSON/NSDictionary 转换为 Typed Swift 类

ios - 如何检查主机服务器是否支持 ResumeData

objective-c - 为什么 NSURLSession 不使用我配置的 NSURLCache?

ios - 从 URLSession Completion Handler 函数返回字符串 Swift 3