【问题标题】:Try to get a UIImage from Asset Library Url尝试从 Asset Library Url 获取 UIImage
【发布时间】:2015-05-19 15:48:21
【问题描述】:

我正在尝试从给定的 Asset-Library-Url 获取 UIImage 对象。我想为我做这个功能。 给定的 Url 是:assets-library://asset/asset.JPG?id=46811D66-DBB4-46D9-BBA2-0CF0D58FC7AD&ext=JPG 我尝试了以下方法:

var url = NSURL() // url = "assets-library://asset/asset.JPG?id=46811D66-DBB4-46D9-BBA2-0CF0D58FC7AD&ext=JPG" got it from another scene
var asset = ALAssetsLibrary()
var tempImage = UIImage()
tempImage = getUIImagefromAsseturl(url)



func getUIImagefromAsseturl (url: NSURL) -> UIImage {

    asset.assetForURL(url, resultBlock: {
        (asset: ALAsset!) in
        if asset != nil {
            var assetRep: ALAssetRepresentation = asset.defaultRepresentation()
            var iref = assetRep.fullResolutionImage().takeUnretainedValue()
            var image =  UIImage(CGImage: iref)
            return image

        }
        }, failureBlock: {
            (error: NSError!) in

            NSLog("Error!", nil)
        }
    )


}

但我总是收到一条错误消息: 无法使用类型为“(NSURL, resultBlock: (ALAsset!) -> _, failureBlock: (NSError!) -> _)'的参数列表调用“assetForURL”

谁能告诉我我在这里做错了什么?

【问题讨论】:

    标签: ios swift uiimage alassetslibrary


    【解决方案1】:

    看起来您正试图从 resultBlock 中返回图像,但该块的类型为 (ALAsset!) -> Void,因此您无法从块内返回图像。虽然 Xcode 的 Swift 错误在这里可能更清楚,但我敢打赌,因为您试图从 resultBlock 返回 UIImage,编译器已推断您提供的 resultBlock 的类型为 (ALAsset!) -> UIImage,这与(ALAsset!) -> Void 的预期类型。

    由于assertForURL:resultBlock:failureBlock: 的工作方式(两个完成都返回类型Void),您将永远无法从任何一个完成块返回任何内容。您需要将用于显示或以其他方式处理图像的代码作为resultBlock 的一部分传递到assertForURL:resultBlock:failureBlock:

    因此,您将无法从函数 getUIImagefromAsseturl: 返回图像,因此您需要删除返回类型 UIImage

    如果您确实打算显示图像,最好从主线程中更新 UI。这很简单:

    func getUIImagefromAsseturl (url: NSURL) {
    
        asset.assetForURL(url, resultBlock: { asset in
            if let ast = asset {
                let assetRep = ast.defaultRepresentation()
                let iref = assetRep.fullResolutionImage().takeUnretainedValue()
                let image = UIImage(CGImage: iref)
                dispatch_async(dispatch_get_main_queue(), {
                    // ...Update UI with image here
                })
            }
        }, failureBlock: { error in
            println("Error: \(error)")
        })
    }
    

    【讨论】:

    • 感谢您的回复,但将代码更改为您的代码,仍然会引发相同的错误。
    • 我再次更新了代码。试试看。它离你的有点远,但功能上和我上次编辑的一样。这个已经过验证可以在 Xcode 6.3.1 中工作。我没有像你那样在resultBlock 中测试nil,而是做了一个标准的Swift if let 绑定。它似乎安抚了 Xcode。
    • 我在定义resultBlock(同样是failureBlock)时使用了{ asset in ... }而不是{ (asset: ALAsset!) in ... }。这让 Xcode 在处理块时只使用推断类型,尽管它确实不应该有所作为。 Xcode + Swift 有时仍然很敏感。
    • 我的图片路径是:/var/mobile/Media/DCIM/100APPLE/IMG_0250.JPG 我可以使用资源库获取图片吗
    猜你喜欢
    • 1970-01-01
    • 2020-04-04
    • 2017-03-26
    • 2016-01-10
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    相关资源
    最近更新 更多