Ada*_*man 19 objective-c alassetslibrary ios7 ios8 photosframework
我在iOS 8上遇到了一个问题,资产库框架似乎是iOS 8中的一个错误.如果我创建一个名为"MyMedia"的专辑然后将其删除,那么当我再次尝试创建专辑时,这个大块下面的代码返回'nil'表示专辑'MyMedia'存在,即使它没有,因为我使用'Photos'应用删除了它.
__block ALAssetsGroup *myGroup = nil;
__block BOOL addAssetDone = false;
NSString *albumName = @"MyMedia";
[assetsLib addAssetsGroupAlbumWithName:albumName
resultBlock:^(ALAssetsGroup *group) {
myGroup = group;
addAssetDone = true;
} failureBlock:^(NSError *error) {
NSLog( @"failed to create album: %@", albumName);
addAssetDone = true;
}];
while (!addAssetDone) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.05f]];
}
return myGroup; // returns nil if group has previously been created and then deleted
Run Code Online (Sandbox Code Playgroud)
创建全新专辑"MyMedia2"时,此方法也适用.有没有其他人遇到此问题,并知道解决方法或解决方案?是唯一能够转移到新"照片"框架的解决方案,还是我在这里做错了什么?请注意,此代码始终适用于iOS7.X
实际上,重现此问题的步骤如下 - > 1.卸载拍摄照片的应用程序并将其保存到自定义相册2.在iOS照片下删除已保存照片的自定义相册3.安装应用程序4.如果您使用不创建它们的应用程序拍摄照片或录制视频或存储它们.如果您在iOS相册下查看,则自定义相册不存在,并且不存在使用该应用拍摄的所有照片/视频.
Ada*_*man 11
我之前的回答是不正确的.我还没有真正测试过它.我终于弄明白了要做什么,这很困难,但我得到了它的工作.这是我必须要做的就是让我的应用程序在iOS 7.xX和iOS 8.Xx上运行并创建一个以前被应用程序删除的自定义相册 - >
我编写了两个代码块:一个使用iOS 8.xx上的Photos框架,另一个使用iOS 7.xx上的AssetsLibrary框架.
Sp应用程序可以在两个iOS版本上运行,我将应用程序链接到Photos框架,但随后将其从必需更改为可选,因此它不会在iOS 7.xx上加载
因为在iOS 7.xx上无法在运行时直接调用Photos框架代码,所以我必须更改它,以便在运行时动态加载类,函数(和块!)
这是在iPhone上运行时工作的代码块.这也应该在模拟器中工作 - >
// PHPhotoLibrary_class will only be non-nil on iOS 8.x.x
Class PHPhotoLibrary_class = NSClassFromString(@"PHPhotoLibrary");
if (PHPhotoLibrary_class) {
/**
*
iOS 8..x. . code that has to be called dynamically at runtime and will not link on iOS 7.x.x ...
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
[PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title];
} completionHandler:^(BOOL success, NSError *error) {
if (!success) {
NSLog(@"Error creating album: %@", error);
}
}];
*/
// dynamic runtime code for code chunk listed above
id sharedPhotoLibrary = [PHPhotoLibrary_class performSelector:NSSelectorFromString(@"sharedPhotoLibrary")];
SEL performChanges = NSSelectorFromString(@"performChanges:completionHandler:");
NSMethodSignature *methodSig = [sharedPhotoLibrary methodSignatureForSelector:performChanges];
NSInvocation* inv = [NSInvocation invocationWithMethodSignature:methodSig];
[inv setTarget:sharedPhotoLibrary];
[inv setSelector:performChanges];
void(^firstBlock)() = ^void() {
Class PHAssetCollectionChangeRequest_class = NSClassFromString(@"PHAssetCollectionChangeRequest");
SEL creationRequestForAssetCollectionWithTitle = NSSelectorFromString(@"creationRequestForAssetCollectionWithTitle:");
[PHAssetCollectionChangeRequest_class performSelector:creationRequestForAssetCollectionWithTitle withObject:albumName];
};
void (^secondBlock)(BOOL success, NSError *error) = ^void(BOOL success, NSError *error) {
if (success) {
[assetsLib enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if (group) {
NSString *name = [group valueForProperty:ALAssetsGroupPropertyName];
if ([albumName isEqualToString:name]) {
groupFound = true;
handler(group, nil);
}
}
} failureBlock:^(NSError *error) {
handler(nil, error);
}];
}
if (error) {
NSLog(@"Error creating album: %@", error);
handler(nil, error);
}
};
// Set the success and failure blocks.
[inv setArgument:&firstBlock atIndex:2];
[inv setArgument:&secondBlock atIndex:3];
[inv invoke];
}
else {
// code that always creates an album on iOS 7.x.x but fails
// in certain situations such as if album has been deleted
// previously on iOS 8...x. .
[assetsLib addAssetsGroupAlbumWithName:albumName
resultBlock:^(ALAssetsGroup *group) {
handler(group, nil);
} failureBlock:^(NSError *error) {
NSLog( @"Failed to create album: %@", albumName);
handler(nil, error);
}];
}
Run Code Online (Sandbox Code Playgroud)
只是想更新大家,我应该早点更新,但我有点忙于工作。此问题是/曾经是 iOS 8 的问题,但已在 iOS 8.0.2 中修复,因此您只需将 iOS 更新到 iOS 8.0.2 即可修复此问题
归档时间: |
|
查看次数: |
9273 次 |
最近记录: |