【问题标题】:Cannot invoke 'dataTask' with an argument list of type (with: NSMutableRequest, ...)无法使用类型的参数列表调用“dataTask”(使用:NSMutableRequest,...)
【发布时间】:2017-08-28 06:55:50
【问题描述】:

func performGetRequest(_ targetURL: URL!, completion: @escaping (_ data: Data?, _ HTTPStatusCode: Int, _ error: NSError?) -> Void) {
    let request = NSMutableURLRequest(url: targetURL)
    request.httpMethod = "GET"

    let sessionConfiguration = URLSessionConfiguration.default

    let session = URLSession(configuration: sessionConfiguration)

    let task = session.dataTask(with: request, completionHandler: { (data: Data?, response: URLResponse?, error: NSError?) -> Void in
        DispatchQueue.main.async(execute: { () -> Void in
            completion(data, (response as! HTTPURLResponse).statusCode, error)
        })
    })

    task.resume()
}

在这里,我正在尝试 appCoda 的演示以集成 YouTube API。但由于此方法错误无法进一步移动:

无法使用类型为“(使用:NSMutableURLRequest,completionHandler:(Data?, URLResponse..)”的参数列表调用“dataTask”

【问题讨论】:

  • 是的,我已经编辑了我的问题。谢谢。
  • 你的问题不清楚,你想完成什么,遇到了什么错误?请参阅How to ask a good question 部分。
  • let request = NSMutableURLRequest(url: targetURL) 使用URLRequest 而不是NSMutableURLRequest
  • 对不起,我是 swift 新手。不知道要问什么。如果你能帮忙,请。
  • NSStuff:旧的 Objective-C 之一。首选 Swift 类型(只要有一个以 NS 为前缀的类,请检查是否没有 Swift 等效项,也没有“Mutable”)。 dataTask 不知道 (with: 的第一个参数属于 NSMutableURLRequest 类的方法,这就是编译器对你大喊大叫的原因。

标签: swift nsurlsession nsurlsessiondatatask nsurlsessionconfiguration


【解决方案1】:

你可以使用 URLRequest 代替 NSMutableURLRequest:

public func getData(withApiEndpoint apiURL: String, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Swift.Void) {
        var request = URLRequest(url: URL(string: apiURL)!)
        for (key, value) in self.getDefaultHeaders() {
            request.setValue(value, forHTTPHeaderField: key)
        }

        request.httpMethod = String.kGet

        if self.networkSession == nil {
            self.networkSession = URLSession(configuration: getSharedConfiguration(self.isIncognito))
        }
        self.networkDataTask = self.networkSession?.dataTask(with: request as URLRequest) { (data, response, error) in
            if error != nil {
                debugPrint(error!.localizedDescription)
            }
            completionHandler(data, response, error)
        }
        self.networkDataTask?.resume()
    }

【讨论】:

    【解决方案2】:

    试试这个 -

    func performGetRequest(_ targetURL: URL!, completion: @escaping (_ data: Data?, _ HTTPStatusCode: Int, _ error: NSError?) -> Void) {
        var request = URLRequest(url: targetURL)
        request.httpMethod = "GET"
    
        let sessionConfiguration = URLSessionConfiguration.default
    
        let session = URLSession(configuration: sessionConfiguration)
    
        let task = session.dataTask(with: request) { (data, response, error) in
            DispatchQueue.main.async(execute: { () -> Void in
                completion(data, (response as! HTTPURLResponse).statusCode, error)
            })
        }
    
        task.resume()
    }
    

    【讨论】:

      【解决方案3】:

      使用 URLRequest 代替 NSMutableURLRequest

      func performGetRequest(_ targetURL: URL!, completion: @escaping (_ data: Data?, _ HTTPStatusCode: Int, _ error: NSError?) -> Void) {
              var request = URLRequest(url: targetURL)
              request.httpMethod = "GET"
      
              let sessionConfiguration = URLSessionConfiguration.default
      
              let session = URLSession(configuration: sessionConfiguration)
      
      
              let task = session.dataTask(with: request, completionHandler: { (data: Data?, response: URLResponse?, error: NSError?) -> Void in
                  DispatchQueue.main.async(execute: { () -> Void in
                      completion(data, (response as! HTTPURLResponse).statusCode, error)
                  })
              } as! (Data?, URLResponse?, Error?) -> Void)
      
              task.resume()
          }
      

      【讨论】:

      • 您好,上面的 cmets 中已经定义了。谢谢你的回答。
      • 这导致最后一行的 EXC_BAD_INSTRUCTION (code=EXC_i386_INVOP,subcode=0x0) 为! (Data?, URLResponse?, Error?) -> Void)
      • 一分钟我会帮你检查
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多