Использование assetForURL в Swift 1.2

Я пытаюсь получить изображение, которое находится в библиотеке фотографий, и я использую assetForURL для этой цели, но я все время получаю сообщение об ошибке "Невозможно вызвать assetForURL" со списком аргументов типа "(NSURL, resultBlock: (ALAsset!) -> Void, (NSError!) -> Void)'"

Я проверил здесь вопросы и как другие люди используют этот метод, но я всегда получаю ту же ошибку.. Вот мой метод:

class func getImageFromPath(path: String) -> UIImage? {
    let assetsLibrary = ALAssetsLibrary()
    let url = NSURL(string: path)!

    assetsLibrary.assetForURL(url, resultBlock: { (asset: ALAsset!) -> Void in
        return UIImage(CGImage: asset.defaultRepresentation().fullResolutionImage())
    }) { (error: NSError!) -> Void in
        return nil
    }
}

Я не знаю, что мне не хватает.. спасибо!

2 ответа

Решение

ALAssetsLibraryAssetForURLResultBlock а также ALAssetsLibraryAccessFailureBlock не возвращать значение. (-> Void значит нет возвращаемого значения.)

(ALAsset!) -> Void или же (NSError!) -> Void

Так что не стоит возвращаться image или же error внутри этих блоков. Например, просто назначьте локальную переменную в блоке. И вернуть переменную вне блока.

Как ниже:

class func getImageFromPath(path: String) -> UIImage? {
    let assetsLibrary = ALAssetsLibrary()
    let url = NSURL(string: path)!

    var image: UIImage?
    var loadError: NSError?
    assetsLibrary.assetForURL(url, resultBlock: { (asset) -> Void in
        image = UIImage(CGImage: asset.defaultRepresentation().fullResolutionImage().takeUnretainedValue())
    }, failureBlock: { (error) -> Void in
        loadError = error;
    })

    if (!error) {
        return image
    } else {
        return nil
    }
}

Кишикава Кацуми, ты был прав! проблема была в возврате, я меняю свой метод так, и он отлично работает:

class func getImageFromPath(path: String, onComplete:((image: UIImage?) -> Void)) {
    let assetsLibrary = ALAssetsLibrary()
    let url = NSURL(string: path)!
    assetsLibrary.assetForURL(url, resultBlock: { (asset) -> Void in
        onComplete(image: UIImage(CGImage: asset.defaultRepresentation().fullResolutionImage().takeUnretainedValue()))
        }, failureBlock: { (error) -> Void in
            onComplete(image: nil)
    })
}

Спасибо!!

Другие вопросы по тегам