Return value from completion handler - Swift

后端 未结 2 1323
日久生厌
日久生厌 2020-12-01 17:04

I\'m using a loadImage method in a Utilities class and am having some trouble with returning images via closures. Basically because my code could return either an image or a

相关标签:
2条回答
  • 2020-12-01 17:12

    Add a handler to your loadImage func:

    Swift 3

     func loadImage(_ urlString: String, handler:@escaping (_ image:UIImage?)-> Void)
        {
    
            let imageURL: URL = URL(string: urlString)!
    
            URLSession.shared.dataTask(with: imageURL) { (data, _, _) in
                if let data = data{
                    handler(UIImage(data: data))
                }
            }.resume()
        }
    

    Call func like this:

    loadImage("SomeURL") { (image) -> Void in
                if let image = image{
                    DispatchQueue.main.async {
                        self.imageView.image = image
                    }
                }
            }
    

    Swift 2.3

    func loadImage(urlString: String, handler: (image:UIImage?)-> Void)
        {
    
            let imageURL: NSURL = NSURL(string: urlString)!
    
            NSURLSession.sharedSession().dataTaskWithURL(imageURL) { (data, _, _) in
                if let data = data{
                    handler(image: UIImage(data: data))
                }
                }.resume()
        }
    

    Call func like this:

      loadImage("someURL") { (image) -> Void in
                if let image = image{
                    dispatch_async(dispatch_get_main_queue()) {
                        self.imageView.image = image
                    }
                }
            }
    
    0 讨论(0)
  • 2020-12-01 17:34

    I would do it this way:

    public class UtilitiesService: NSObject {
        public class func loadImage(urlString:String, completion:(resultImage:UIImage) -> Void)
        {
    
        var imgURL: NSURL = NSURL(string: urlString)!
        let request: NSURLRequest = NSURLRequest(URL: imgURL)
        NSURLConnection.sendAsynchronousRequest(
            request, queue: NSOperationQueue.mainQueue(),
            completionHandler: {(response: NSURLResponse!,data: NSData!,error: NSError!) -> Void in
                if error == nil {
                    completion(resultImage: UIImage(data: data))
                }
        })
    }
    }
    
    //// view controller
    class someView: UIViewController {
    var image: UIImageView()? //Create the variable the way you need
    loadImage(url, completion: { (resultImage) -> Void in
        image = resultImage //Assign the result to the variable
    })
     }
    

    I think this will work, if it doesn't, tell me and I'll fix it

    0 讨论(0)
提交回复
热议问题