সুইফট 3 ইউআরএলসেশন.সারেড () সদস্যের ডেটাটাস্কের বিষয়ে দ্ব্যর্থহীন রেফারেন্স (সহ: সমাপ্তি হ্যান্ডলার :) ত্রুটি (বাগ)


169

হ্যালো আমি সুইফট ২.২ এর জন্য জেসন পার্সিং কোডে কাজ করছি তবে আমি যখন সুইফট ৩.০ এর জন্য এটি ব্যবহার করি তখন আমাকে ত্রুটিটি দেয়

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নতুন স্বয়ংক্রিয় cast URLRequestালাই যা ব্যর্থ হচ্ছে এবং যা আমাদের এখানে এই castালাই করতে বাধ্য করেছিল।


7
var request = URLRequest(url:myUrl!)
লিও ডাবাস

1
SE-0072 বলেছে, অন্তর্নির্মিত ব্রিজিং সরান। যখন "সুইফটি ফাংশন নাম" "ডি ফ্যাক্টো ওভাররাইড পদ্ধতি" হয়ে যায়, আমরা লক্ষ্য উদ্দেশ্য-সি এসইএলকে বিপরীত করতে পারি না, সুতরাং আমাদের অবশ্যই ফাউন্ডেশন স্ট্রাক্ট ব্যবহার করতে হবে বা কাস্ট করতে হবে।
কোয়েসার 2

2
খুব সহায়ক উত্তর। আমি কেবল যুক্ত করব যে মাইআরআল এড়ানো ভাল হবে! এটি করে জোর করে আন-র্যাপিংয়ের: গার্ডকে আমার ইউআরএল = ইউআরএল (স্ট্রিং: লিস্টআরলস্ট্রিং) অন্যথায় {ফিরতে দাও the তারপরে অনুরোধটি কল ছাড়া কল করা যায়! var অনুরোধ = URLRequest (url: myUrl)
মার্ক সেমসেল

2
URL(string:)কনস্ট্রাক্টর কি কখনও ব্যর্থ হতে পারে?
বলপয়েন্টবেন

ভোট দিতে হবে তবে আমার এখনও সমস্যা আছে, এটি "চরিত্রের আশেপাশের 0 অবৈধ মান" কেও আউটপুট করে?
মারফিন এফ

33

আপনি যেমনটি শুরু myRequestকরেছেন NSMutableURLRequest, আপনার এটি দরকার:

var URLRequest

সুইফট দুটোই ডিচ করছে NSMutable...। শুধু varনতুন ক্লাসের জন্য ব্যবহার করুন ।


17

এক্সকোড 8 এবং সুইফট 3.0

ইউআরএলসেশন ব্যবহার:

 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()

ইউআরএলসেশন ডেলিগেট কল:

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){

}

ব্লক জিইটি / পোস্ট / পুট / ডিলিট ব্যবহার করুন:

 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

এই সমস্যাটি ইউআরএলসেশনের কারণে ঘটেছে দুটি ডেটা টাস্ক পদ্ধতি রয়েছে

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
}

বুদ্ধি না। ধন্যবাদ
আইবুগ

10

আমার ক্ষেত্রে ত্রুটিটি এনএসআরএল ছিল

let url = NSURL(string: urlString)

সুইফ্ট 3 এ আপনাকে অবশ্যই ইউআরএল লিখতে হবে :

let url = URL(string: urlString)

3

এক্সকোড 8 স্থিতিশীল সংস্করণ পরীক্ষিত; Thats এর var requestসাথে ভেরিয়েবল ব্যবহার করা দরকার আপনি URLRequest()সহজেই এটি ঠিক করতে পারেন ( বাগ) )

var request = URLRequest(url:myUrl!) এবং

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

ভাল কাজ! ধন্যবাদ আপনাকে বলছি, আমি মনে করি অনেক লোককে সহায়তা করি। !


1
এটি ইউআরএল অনুরোধ থেকে URLRequest- এ কাস্ট করার কোনও অর্থ হয় না
লিও ডাবাস

var request = URLRequest(url: url); let task = URLSession.shared().dataTask(with: request) { ... }
লিও ডাবাস

sharedসুইফট 3 (কোনও বন্ধনী নেই) এর পরিবর্তে একটি সম্পত্তি।
ভাদিয়ান

@ মন্তব্যটি আমি মন্তব্য পোস্ট করার সময় নয়
লিও ডাবাস

3

সুইফট 3 এবং এক্সকোড 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 এ সংকলকটি ফাংশনের স্বাক্ষরে বিভ্রান্ত হয়। এটি নির্দিষ্ট করে ত্রুটি মুছে ফেলা হবে। ইউআরএল স্ট্রিংটি ইউআরএল টাইপে রূপান্তর করুন। নিম্নলিখিত কোডটি আমার পক্ষে কাজ করেছিল।

   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

একটি জিইটি অনুরোধের মাধ্যমে ডেটা লোড করার জন্য আপনার কোনও 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

এক্সকোড 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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.