NSURL, URL and NSData, Data

21

我刚接触Swift。我正在从互联网上获取图像时发现了NSURLURL以及NSDataData。我感到非常困惑。我使用了以下代码,但是我必须像下面所示转换类型。正确的做法是什么,NSURLURLNSDataData之间有什么区别?请有人帮帮我。

if let theProfileImageUrl = tweet.user.profileImageURL{
    if let imageData = NSData(contentsOf: theProfileImageUrl as URL){
        profileImageView.image = UIImage(data: imageData as Data)
    }
}
2个回答

42

在Swift 3发布时,许多类名去掉了NS前缀,它们只应与Objective-C代码一起使用。 如果您正在编写Swift 3代码,则应仅使用更新的类。 在这种情况下,使用URLData

但是,URL被桥接到NSURLData被桥接到NSData,因此可以在需要时进行类型转换。

if let theProfileImageUrl = tweet.user.profileImageURL {
    do {
        let imageData = try Data(contentsOf: theProfileImageUrl as URL)
        profileImageView.image = UIImage(data: imageData)
    } catch {
        print("Unable to load data: \(error)")
    }
}

我不知道tweet.user.profileImageURL是在哪里定义的,但它似乎正在使用NSURL,因此您需要在代码中进行强制转换为URL


谢谢你的建议。我已将所有内容转换为Url和Data,但在这一行代码上出现了错误:如果让imageData = Data(contentsOf: theProfileImageUrl){ - Nikhil Sridhar
我忘记了Data(contentsOf:)可能会抛出错误的事实。请查看我的更新答案。 - rmaddy
很高兴能够帮助您。请不要忘记接受解决您问题的答案和/或点赞有帮助的问题。 - rmaddy
我提到这个是因为我注意到您以前从未接受过任何问题的答案。您应该回去接受那些实际解决了您以前问题的答案。 - rmaddy
1
@LeoDabus 我一直以为profileImageURL来自某个将其定义为NSURL的API。你是正确的,如果它已经是URL,那么强制转换是不需要的;如果OP在他们自己的代码中声明它为NSURL,那么应该使用URL - rmaddy
显示剩余2条评论

4

使用 SWIFT 5.0 + 后台抓取数据

private func fetchImage(_ photoURL: URL?) {

    guard let imageURL = photoURL else { return  }

    DispatchQueue.global(qos: .userInitiated).async {
        do{
            let imageData: Data = try Data(contentsOf: imageURL)

            DispatchQueue.main.async {
                let image = UIImage(data: imageData)
                self.userImageView.image = image
                self.userImageView.sizeToFit()
            }
        }catch{
                print("Unable to load data: \(error)")
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接