【问题标题】:iOS-Swift 3-SDWebImageiOS-Swift 3-SDWebImage
【发布时间】:2016-09-29 20:02:51
【问题描述】:

我将代码从 Swift 2 更新到 Swift 3,发现 SDWebImage 的错误。

SDWebImageManager.shared().downloadImage(with: URL(string: book.picURL), options: .lowPriority, progress: { (min:Int, max:Int) -> Void in

            }) { (image:UIImage!, error:NSError!, cacheType:SDImageCacheType, finished:Bool, url:NSURL!) -> Void in
                if image != nil && finished
                {

                    let obj = cell.keepUrl
                    if obj != nil && url != nil && obj == url
                    {
                        cell.picURL.image = image
                    }
                }
            }

SDWebImageCompletionWithFinishedBlock的定义如下

typedef void(^SDWebImageCompletionWithFinishedBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL);

错误信息是

“无法将类型 '(UIImage!, NSError!, SDImageCacheType, Bool, NSURL!) -> Void' 的值转换为预期的参数类型 'SDWebImageCompletionWithFinishedBlock!'”

谁能帮我解决这个错误?谢谢。

【问题讨论】:

    标签: ios swift sdwebimage


    【解决方案1】:

    完成块的签名是这样的:

    typealias PrefetchingDone = (UIImage?, Error?, SDImageCacheType, Bool, URL?) -> Void
    

    您需要进行以下更改

    1. NSError 更改为Error
    2. NSURL 更改为URL
    3. ! 更改为?

    使用它,您可以编写这样的方法:

    class func preloadImageWithUrlString(_ urlString: String, fetchedClosure: ImageFetchedClosure? = nil) {
        let imageURLString = addWidthParameter(urlString, width: width)
        guard let url = URL(string: imageURLString) else { 
            // Call closure with some error...
            fetchedClosure(nil, MyError.someCustomErrorHere, SDImageCacheTypeNone, true, nil)
            return
        }
    
        SDWebImageManager.shared().downloadImage(with: url, options: SDWebImageOptions(rawValue: 0), progress: nil) { 
            (maybeImage, maybeError, cacheType, finished, imageURL) in
            if let closure = completionClosure {
                closure(maybeImage, maybeError, cacheType, url)
            }
        }
    }
    

    你这样使用:

    UIImageView.preloadImageWithUrlString("http://some.url.com/myImage.png") { 
        (maybeImage, maybeError, cacheType, finished, imageURL) in
        print("prefetching done")
    }
    

    【讨论】:

    • 您是否也从NSError 更改为Error?我将更新我的答案以明确说明
    • 谢谢,在我的情况下,它在更改 UIImage 后工作!到 UIImage?和 NSError!错误?,非常感谢。
    • @Sajjon - 怎么会知道这一点?鉴于方法签名在 Obj-C 中,但您似乎将 Swift 翻译的方法签名放在那里。你是怎么知道的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多