尝试从资源库网址

时间:2015-05-19 15:48:22

标签: ios swift uiimage alassetslibrary

我试图从给定的Asset-Library-Url获取UIImage对象。我想为我做这个功能。 给定的网址是: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)
        }
    )


}

但我总是得到一个错误说: 无法调用" assetForURL'使用类型'的参数列表(NSURL,resultBlock:(ALAsset!) - > _,failureBlock:(NSError!) - > _)'

任何人都可以告诉我我在这里做错了吗?

1 个答案:

答案 0 :(得分:4)

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

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

因此,您将无法从函数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)")
    })
}