Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AlassetLibrary assetForURL:始终为“中的照片返回零”;“我的照片流”;在iOS 8.1中_Ios_Alassetslibrary_Alasset_Ios8.1 - Fatal编程技术网

AlassetLibrary assetForURL:始终为“中的照片返回零”;“我的照片流”;在iOS 8.1中

AlassetLibrary assetForURL:始终为“中的照片返回零”;“我的照片流”;在iOS 8.1中,ios,alassetslibrary,alasset,ios8.1,Ios,Alassetslibrary,Alasset,Ios8.1,此代码在iOS 7中运行良好,但在iOS 8.1中,“我的照片流”相册中的所有资产在结果块中均为零。(不调用failureBlock。)普通相册和共享相册工作正常 我尝试了以下公认的答案: 也就是说,我持有对AlassetLibrary对象的引用,监听AlassetLibraryChangedNotification事件(顺便说一句,这不会发生,但很好。)我确保我的应用程序具有访问照片的权限,我使用wi-fi,在我的tableView中可以看到照片的缩略图。就在我尝试使用assetForURL:

此代码在iOS 7中运行良好,但在iOS 8.1中,“我的照片流”相册中的所有资产在结果块中均为零。(不调用failureBlock。)普通相册和共享相册工作正常

我尝试了以下公认的答案:

也就是说,我持有对AlassetLibrary对象的引用,监听
AlassetLibraryChangedNotification
事件(顺便说一句,这不会发生,但很好。)我确保我的应用程序具有访问照片的权限,我使用wi-fi,在我的tableView中可以看到照片的缩略图。就在我尝试使用
assetForURL:
加载它们时,它们总是为零

// example URL: assets-library://asset/asset.JPG?id=1ECB69B9-DC7A-45A7-B135-F43317D3412C&ext=JPG
[self.library assetForURL:[NSURL URLWithString:url] resultBlock:^(ALAsset *asset) {
    NSLog(@"Asset: %@", asset); // nil :(
} failureBlock:^(NSError *error) {
    NSLog(@"Failure, wahhh!");
}];

还有人看到这个问题吗?

在iOS 8.0及更高版本中,苹果建议使用照片框架而不是资产库框架


我也有同样的问题。切换到照片框架目前不是我的选择,但幸运的是我找到了一个解决办法。您可能会发现它非常难看,我怀疑当照片流包含大量照片时,它的工作速度可能会很慢,但总比没有好

其思想是枚举Photo Stream资产组中的所有项目,并将必要的URL与每个项目的URL进行比较。幸运的是,它仍然有效

我有这样一个方法(library是同一类的setLibrary属性,您可能需要在代码中初始化它):


希望这能有所帮助。

在任何地方都找不到任何答案后,我创建了以下PHAsset扩展,它在iOS 8.2上运行良好,尽管我认为理论上速度很慢。尽管之前的一条评论说这在iOS8.2测试版上已经修复,但在iOS8.2发布之后,这个bug仍然存在

import Photos
import UIKit

extension PHAsset {
    class func fetchAssetWithALAssetURL (alURL: NSURL) -> PHAsset? {
        let phPhotoLibrary = PHPhotoLibrary.sharedPhotoLibrary()
        let assetManager = PHImageManager()
        var phAsset : PHAsset?

        let optionsForFetch = PHFetchOptions()
        optionsForFetch.includeHiddenAssets = true

        var fetchResult = PHAsset.fetchAssetsWithALAssetURLs([alURL], options: optionsForFetch)
        if fetchResult?.count > 0 {
            return fetchResult[0] as? PHAsset
        } else {
            var str = alURL.absoluteString!
            let startOfString = advance(find(str, "=")!, 1)
            let endOfString = advance(startOfString, 36)
            let range = Range<String.Index>(start:startOfString, end:endOfString)
            let localIDFragment = str.substringWithRange(range)
            let fetchResultForPhotostream = PHAssetCollection.fetchAssetCollectionsWithType(PHAssetCollectionType.Album, subtype: PHAssetCollectionSubtype.AlbumMyPhotoStream, options: nil)
            if fetchResultForPhotostream?.count > 0 {
                let photostream = fetchResultForPhotostream![0] as PHAssetCollection
                let fetchResultForPhotostreamAssets = PHAsset.fetchAssetsInAssetCollection(photostream, options: optionsForFetch)
                if fetchResultForPhotostreamAssets?.count >= 0 {
                    var stop : Bool = false
                    for var i = 0; i < fetchResultForPhotostreamAssets.count && !stop; i++ {
                        let phAssetBeingCompared = fetchResultForPhotostreamAssets[i] as PHAsset
                        if phAssetBeingCompared.localIdentifier.rangeOfString(localIDFragment, options: nil, range: nil, locale: nil) != nil {
                            phAsset = phAssetBeingCompared
                            stop = true
                        }
                    }
                    return phAsset
                }
            }
            return nil
        }
    }
}
导入照片
导入UIKit
扩展相位集{
类func fetchAssetWithALAssetURL(alURL:NSURL)->PHAsset{
设phPhotoLibrary=phPhotoLibrary.sharedPhotoLibrary()
让assetManager=PHImageManager()
var相集:相集?
let optionsForFetch=PHFetchOptions()
optionsForFetch.includeHiddenAssets=true
var fetchResult=PHAsset.fetchAssetsWithALAssetURLs([alURL],选项:optionsForFetch)
如果fetchResult?.count>0{
将fetchResult[0]返回为相集
}否则{
var str=alURL.absoluteString!
让startOfString=advance(查找(str,“=”),1)
让endOfString=advance(startOfString,36)
let range=range(开始:startOfString,结束:endOfString)
让localIDFragment=str.substringWithRange(范围)
让fetchResultForPhotostream=PHAssetCollection.fetchAssetCollectionsWithType(PHAssetCollectionType.Album,子类型:PHAssetCollectionSubtype.AlbumMyPhotoStream,选项:nil)
如果fetchResultForPhotostream?.count>0{
将photostream=fetchResultForPhotostream![0]设为PHAssetCollection
让fetchResultForPhotostreamAssets=PHAsset.fetchAssetsInAssetCollection(photostream,选项:options for fetch)
如果fetchResultForPhotostreamAssets?.count>=0{
变量停止:Bool=false
对于var i=0;i
在iOS 8.1上使用iPad mini进行测试,以下是您在新版本中应如何做到这一点:

NSURL*url=/*iOS 8之前的旧ALAsset库中的资产url*/
PHFetchResult*assets=[PHAsset FetchAssets WithAlasSetUrls:@[url]
选项:无];
断言(assets.count==1);
PHAsset*asset=assets.firstObject;
[[PHImageManager defaultManager]requestImageForAsset:asset
targetSize:CGSizeMake(800800)//TODO:您的目标大小
contentMode:PHImageContentModeDefault
选项:无
resultHandler:^(UIImage*\u可空结果,NSDictionary*\u可空信息)
{
//你想做什么就做什么,结果会怎样
}];

我观察到,尝试在同一资产的writeImage toSavedPhotosAlbum成功块中使用assetForURL检索资产将产生零资产(大多数情况下)

但是,在writeImage成功块完成执行后的一段时间内,使用assetForURL检索资产确实会生成正确的资产

等待1秒有效,而仅等待300毫秒无效。但是,对于每种设备和情况,这当然是不同的


这并不能以令人满意的方式回答问题,但可能有助于其他人找出潜在的问题。

虽然这并不理想,但确实起到了作用,非常感谢!不要过分挑剔,但它看起来像
项。url
应该是
url
正确吗?我们可能需要调用在集合中通过的成功块。再次感谢!我的瞬间和我的照片流都有同样的问题,尽管上面的解决方案不起作用…枚举组没有任何作用…即使我将AlassetGroupPhotostream更改为AlassetGroupAllStrange,它在这里也起了作用-你确定你批准了照片的权限吗?@taber你是对的!我从我的项目中复制了它,代码太复杂了。我忘记在那里重命名item.url,在插入成功点命令时省略了successBlock代码
import Photos
import UIKit

extension PHAsset {
    class func fetchAssetWithALAssetURL (alURL: NSURL) -> PHAsset? {
        let phPhotoLibrary = PHPhotoLibrary.sharedPhotoLibrary()
        let assetManager = PHImageManager()
        var phAsset : PHAsset?

        let optionsForFetch = PHFetchOptions()
        optionsForFetch.includeHiddenAssets = true

        var fetchResult = PHAsset.fetchAssetsWithALAssetURLs([alURL], options: optionsForFetch)
        if fetchResult?.count > 0 {
            return fetchResult[0] as? PHAsset
        } else {
            var str = alURL.absoluteString!
            let startOfString = advance(find(str, "=")!, 1)
            let endOfString = advance(startOfString, 36)
            let range = Range<String.Index>(start:startOfString, end:endOfString)
            let localIDFragment = str.substringWithRange(range)
            let fetchResultForPhotostream = PHAssetCollection.fetchAssetCollectionsWithType(PHAssetCollectionType.Album, subtype: PHAssetCollectionSubtype.AlbumMyPhotoStream, options: nil)
            if fetchResultForPhotostream?.count > 0 {
                let photostream = fetchResultForPhotostream![0] as PHAssetCollection
                let fetchResultForPhotostreamAssets = PHAsset.fetchAssetsInAssetCollection(photostream, options: optionsForFetch)
                if fetchResultForPhotostreamAssets?.count >= 0 {
                    var stop : Bool = false
                    for var i = 0; i < fetchResultForPhotostreamAssets.count && !stop; i++ {
                        let phAssetBeingCompared = fetchResultForPhotostreamAssets[i] as PHAsset
                        if phAssetBeingCompared.localIdentifier.rangeOfString(localIDFragment, options: nil, range: nil, locale: nil) != nil {
                            phAsset = phAssetBeingCompared
                            stop = true
                        }
                    }
                    return phAsset
                }
            }
            return nil
        }
    }
}
NSURL *url = /* your asset url from the old ALAsset library prior to iOS 8 */
PHFetchResult<PHAsset *> *assets = [PHAsset fetchAssetsWithALAssetURLs:@[url]
                                                               options:nil];
assert(assets.count == 1);
PHAsset *asset = assets.firstObject;

[[PHImageManager defaultManager] requestImageForAsset:asset
                   targetSize:CGSizeMake(800, 800) // TODO: your target size
                  contentMode:PHImageContentModeDefault
                      options:nil
                resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info)
 {
     // Do whatever you want to the result
 }];