尝试从资产库中获取 UIImage Url
Try to get a UIImage from Asset Library Url
我正在尝试从给定的 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'
谁能告诉我我做错了什么?
看起来您正试图从 resultBlock
中 return 您的图像,但该块的类型是 (ALAsset!) -> Void
,因此您不能 return 来自块内。虽然 Xcode 的 Swift 错误在这里可能更清楚,但我敢打赌,因为您正在尝试 return 来自 resultBlock
的 UI 图像,编译器已将您提供的 resultBlock
的类型推断为 (ALAsset!) -> UIImage
,这与 (ALAsset!) -> Void
.
的预期类型不匹配
由于 assertForURL:resultBlock:failureBlock:
的工作方式(两个完成 return 类型 Void
),您将永远无法从任何一个完成块中 return 任何内容。作为 resultBlock
.
的一部分,您需要将用于显示或以其他方式处理图像的代码传递到 assertForURL:resultBlock:failureBlock:
中
因此,您将无法 return 函数 getUIImagefromAsseturl:
中的图像,因此您需要删除 return 类型 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)")
})
}
我正在尝试从给定的 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'
谁能告诉我我做错了什么?
看起来您正试图从 resultBlock
中 return 您的图像,但该块的类型是 (ALAsset!) -> Void
,因此您不能 return 来自块内。虽然 Xcode 的 Swift 错误在这里可能更清楚,但我敢打赌,因为您正在尝试 return 来自 resultBlock
的 UI 图像,编译器已将您提供的 resultBlock
的类型推断为 (ALAsset!) -> UIImage
,这与 (ALAsset!) -> Void
.
由于 assertForURL:resultBlock:failureBlock:
的工作方式(两个完成 return 类型 Void
),您将永远无法从任何一个完成块中 return 任何内容。作为 resultBlock
.
assertForURL:resultBlock:failureBlock:
中
因此,您将无法 return 函数 getUIImagefromAsseturl:
中的图像,因此您需要删除 return 类型 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)")
})
}