स्विफ्ट 3 URLSession.sared () सदस्य के डेटा के लिए अस्पष्ट संदर्भ (साथ: पूरा करने वाला: :) (गुप्त)


169

नमस्कार, मैंने स्विफ्ट 2.2 के लिए जॉन्स पार्सिंग कोड काम किया है, लेकिन जब मैं स्विफ्ट 3.0 के लिए इसका उपयोग करता हूं तो मुझे वह त्रुटि मिलती है

ViewController.swift: 132: 31: सदस्य के डेटा के लिए अस्पष्ट संदर्भ (साथ: समापन: :)

मेरे कोड यहाँ

   let listUrlString =  "http://bla.com?batchSize=" + String(batchSize) + "&fromIndex=" + String(fromIndex)
    let myUrl = URL(string: listUrlString);
    let request = NSMutableURLRequest(url:myUrl!);
    request.httpMethod = "GET";

    let task = URLSession.shared().dataTask(with: request) {
        data, response, error in

        if error != nil {
            print(error!.localizedDescription)
            DispatchQueue.main.sync(execute: {
                AWLoader.hide()
            })

            return
        }

        do {

            let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSArray

            if let parseJSON = json {

                var items = self.categoryList

                items.append(contentsOf: parseJSON as! [String])

                if self.fromIndex < items.count {

                    self.categoryList = items
                    self.fromIndex = items.count

                    DispatchQueue.main.async(execute: {

                        self.categoriesTableView.reloadData()

                        AWLoader.hide()

                    })
                }else if( self.fromIndex == items.count){


                    DispatchQueue.main.async(execute: {

                        AWLoader.hide()

                    })

                }



            }

        } catch {
            AWLoader.hide()
            print(error)

        }
    }

    task.resume()

विचारों के लिए धन्यवाद।


2
मुझे वही त्रुटि मिल रही थी क्योंकि मैं एक स्ट्रिंग पास कर dataTask(with:रहा था जैसे कि मेरे पास था url = "www.yahoo.comऔर मैं इसे सीधे समारोह में पारित कर रहा था बिना इसे परिवर्तित किएURL
हनी

जवाबों:


312

कंपाइलर फ़ंक्शन हस्ताक्षर से भ्रमित है। आप इसे इस तरह से ठीक कर सकते हैं:

let task = URLSession.shared.dataTask(with: request as URLRequest) {

लेकिन, ध्यान दें कि हम के रूप में कास्ट "अनुरोध" की जरूरत नहीं है URLRequestइस हस्ताक्षर में अगर यह पहले के रूप में घोषित किया गया था URLRequestके बजाय NSMutableURLRequest:

var request = URLRequest(url:myUrl!)

यह स्वचालित NSMutableURLRequestऔर नए के बीच की कास्टिंग है जो URLRequestविफल हो रही है और जिसने हमें यहां इस कास्टिंग को करने के लिए मजबूर किया है।


7
var request = URLRequest(url:myUrl!)
लियो डबस

1
SE-0072 में कहा गया है, अंतर्निहित ब्रिजिंग को हटा दें। जब "स्विफ्टी फंक्शन नेम" "डी ओक्टो ओवरराइड मेथड" बन जाता है, तो हम लुकअप ऑब्जेक्टिव-सी सेलेक्ट को रिवर्स नहीं कर सकते हैं, इसलिए हमें फाउंडेशन स्ट्रक्चर का उपयोग या कास्ट करना होगा।
quesera2

2
बहुत ही उपयोगी उत्तर। मैं केवल यह जोड़ूंगा कि myUrl से बचना अच्छा होगा! ऐसा करने के लिए मजबूर करने के लिए मजबूर: गार्ड को myUrl = URL (string: listUrlString) और {रिटर्न} दें, फिर अनुरोध को बिना कॉल किया जा सकता है! var रिक्वेस्ट = URLRequest (url: myUrl)
मार्क सेमेल

2
क्या URL(string:)कंस्ट्रक्टर कभी फेल हो सकता है?
बॉलपॉइंटबैन

मत देना, लेकिन मुझे अभी भी समस्या है, यह "चरित्र 0 के आसपास अमान्य मान" किसी को भी करता है?
मारफिन। F

33

आपके पास init'd myRequestहै NSMutableURLRequest, आपको इसकी आवश्यकता है:

var URLRequest

स्विफ्ट दोनों NSMutable...चीज को खोद रही है। बस varनई कक्षाओं के लिए उपयोग करें ।


17

Xcode 8 और स्विफ्ट 3.0

URLSession का उपयोग करना:

 let url = URL(string:"Download URL")!
 let req = NSMutableURLRequest(url:url)
 let config = URLSessionConfiguration.default
 let session = URLSession(configuration: config, delegate: self, delegateQueue: OperationQueue.main)

 let task : URLSessionDownloadTask = session.downloadTask(with: req as URLRequest)
task.resume()

URLSession प्रतिनिधि कॉल:

func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {

}


func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, 
didWriteData bytesWritten: Int64, totalBytesWritten writ: Int64, totalBytesExpectedToWrite exp: Int64) {
                   print("downloaded \(100*writ/exp)" as AnyObject)

}

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL){

}

ब्लॉक GET / POST / PUT / DELETE का उपयोग करना:

 let request = NSMutableURLRequest(url: URL(string: "Your API URL here" ,param: param))!,
        cachePolicy: .useProtocolCachePolicy,
        timeoutInterval:"Your request timeout time in Seconds")
    request.httpMethod = "GET"
    request.allHTTPHeaderFields = headers as? [String : String] 

    let session = URLSession.shared

    let dataTask = session.dataTask(with: request as URLRequest) {data,response,error in
        let httpResponse = response as? HTTPURLResponse

        if (error != nil) {
         print(error)
         } else {
         print(httpResponse)
         }

        DispatchQueue.main.async {
           //Update your UI here
        }

    }
    dataTask.resume()

मेरे लिए ठीक काम कर रहा है .. इसे 100% परिणाम की गारंटी दें


15

यह समस्या URLSession की वजह से है दो dataTask विधियाँ हैं

open func dataTask(with request: URLRequest, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Swift.Void) -> URLSessionDataTask
open func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Swift.Void) -> URLSessionDataTask

पहले एक के पास URLRequestपैरामीटर है, और दूसरे के पास URLपैरामीटर के रूप में है, इसलिए हमें यह निर्दिष्ट करना होगा कि किस प्रकार का कॉल करना है, उदाहरण के लिए, मैं दूसरी विधि को कॉल करना चाहता हूं।

let task = URLSession.shared.dataTask(with: url! as URL) {
    data, response, error in
    // Handler
}

समझ में आया। धन्यवाद
iBug

10

मेरे मामले में त्रुटि NSURL में थी

let url = NSURL(string: urlString)

स्विफ्ट 3 में आपको बस URL लिखना होगा :

let url = URL(string: urlString)

3

परीक्षण किया गया xcode 8 स्थिर संस्करण; var requestचर के साथ चर का उपयोग करने की आवश्यकता URLRequest()है जिसे आप आसानी से ठीक कर सकते हैं ( बग )

var request = URLRequest(url:myUrl!) तथा

let task = URLSession.shared().dataTask(with: request as URLRequest) { }

ठीक काम किया! धन्यवाद दोस्तों, मुझे लगता है कि कई लोग मदद करते हैं। !


1
इससे
URLRequest से URLRequest

var request = URLRequest(url: url); let task = URLSession.shared().dataTask(with: request) { ... }
सिंह दब्बू

sharedस्विफ्ट 3 (कोई कोष्ठक नहीं) में एक समारोह के बजाय एक संपत्ति है।
वाडियन

@vadian उस समय नहीं था जब मैंने टिप्पणी पोस्ट की थी
लियो डबस

3

स्विफ्ट 3 और Xcode 8 के लिए:

      var dataTask: URLSessionDataTask?

      if  let url = URL(string: urlString) {
            self.dataTask = URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in

                if let error = error {
                    print(error.localizedDescription)
                } else if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 {
                     // You can use data received.
                    self.process(data: data as Data?)
                }
            })
        }
     }

// नोट: त्रुटि की जांच के लिए आप हमेशा डिबगर का उपयोग कर सकते हैं


3

स्विफ्ट 3 में कंपाइलर को फंक्शन सिग्नेचर द्वारा भ्रमित किया जाता है। इसे निर्दिष्ट करने से त्रुटि स्पष्ट हो जाएगी। URL टाइप करने के लिए url स्ट्रिंग भी बदलें। निम्नलिखित कोड ने मेरे लिए काम किया।

   let urlString = "http://bla.com?batchSize="
   let pathURL = URL(string: urlString)!
   var urlRequest = URLRequest(url:pathURL)

    let session = URLSession.shared
    let dataTask = session.dataTask(with: urlRequest as URLRequest) { (data,response,error) in

3

स्विफ्ट 3 के लिए संक्षिप्त और संक्षिप्त उत्तर:

guard let requestUrl = URL(string: yourURL) else { return }

let request = URLRequest(url:requestUrl)
URLSession.shared.dataTask(with: request) {
    (data, response, error) in
    ...

}.resume()

2
 // prepare json data
        let mapDict = [ "1":"First", "2":"Second"]

        let json = [ "title":"ABC" , "dict": mapDict ] as [String : Any]
        let jsonData : NSData = NSKeyedArchiver.archivedData(withRootObject: json) as NSData

        // create post request
        let url = NSURL(string: "http://httpbin.org/post")!
        let request = NSMutableURLRequest(url: url as URL)
        request.httpMethod = "POST"

        // insert json data to the request
        request.httpBody = jsonData as Data


        let task = URLSession.shared.dataTask(with: request as URLRequest){ data,response,error in
            if error != nil{
                return
            }
            do {
                let result = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject]

                print("Result",result!)

            } catch {
                print("Error -> \(error)")
            }
        }

        task.resume()

2

GET अनुरोध के माध्यम से डेटा लोड करने के लिए आपको किसी भी URLRequest(और अर्धविराम) की आवश्यकता नहीं है

let listUrlString =  "http://bla.com?batchSize=" + String(batchSize) + "&fromIndex=" + String(fromIndex)
let myUrl = URL(string: listUrlString)!
let task = URLSession.shared.dataTask(with: myUrl) { ...

2
let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: { data,response,error in
        if error != nil{
            print(error!.localizedDescription)
            return
        }
        if let responseJSON = (try? JSONSerialization.jsonObject(with: data!, options: [])) as? [String:AnyObject]{
            if let response_token:String = responseJSON["token"] as? String {
                print("Singleton Firebase Token : \(response_token)")
                completion(response_token)
            }
        }
    })
    task.resume()

2

Xcode 10.1 स्विफ्ट 4

यह मेरे लिए काम किया:

let task: URLSessionDataTask = session.dataTask(with: request as URLRequest) { (data, response, error) -> Void in
...

कुंजी URLSessionDataTaskप्रकार की घोषणा में जोड़ रहा था ।


1

मेरे लिए मैं इसे खोजने के लिए ऐसा करता हूं,

let url = URL(string: urlString)
URLSession.shared.dataTask(with: url!) { (data, response, error) in ...}

उपयोग नहीं कर सकते

"let url = NSURL(string: urlString)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.