gpt4 book ai didi

objective-c - AssetsLibrary 框架在 iOS 8 上损坏

转载 作者:太空狗 更新时间:2023-10-30 03:14:24 25 4
gpt4 key购买 nike

我在 iOS 8 上遇到了一个问题, Assets 库框架似乎是 iOS 8 中的一个错误。如果我创建了一个名为“MyMedia”的相册,然后将其删除,那么当我再次尝试创建相册时,下面的这段代码返回“nil”,表明相册“MyMedia”存在,即使它不存在,因为我使用“照片”应用删除了它。

__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

创建全新专辑“MyMedia2”时,同样的方法也适用。有没有其他人遇到过这个问题并且知道解决方法或解决方案?是迁移到新的“照片”框架的唯一解决方案还是我在这里做错了什么?请注意,此代码始终适用于 iOS7.X

其实重现这个问题的步骤如下->1. 卸载您拍摄照片并将其保存到自定义相册的应用2.在iOS Photos下删除保存有照片的自定义相册3. 安装您的应用4. 如果您使用该应用拍照或录制视频,它不会创建或存储它们。如果您查看 iOS 照片相册,自定义相册不存在,并且使用该应用拍摄的照片/视频都不存在。

最佳答案

我之前的回答是错误的。我还没有真正测试过。我终于弄清楚必须做什么,这很困难,但我让它工作了。这是我必须做的,才能让我的应用程序在 iOS 7.x.X 和 iOS 8.X.x 上运行,并创建一个之前已被应用程序删除的自定义相册 -->

  1. 我写了两段代码:一段在 iOS 8.x.x 上使用 Photos 框架,另一段在 iOS 7.x.x 上使用 AssetsLibrary 框架

  2. Sp 该应用程序可以在两个 iOS 版本上运行,我将该应用程序链接到照片框架,但随后将其从必需更改为可选,因此它不会在 iOS 7.x.x 上加载

  3. 因为在 iOS 7.x.x 上无法在运行时直接调用 Photos 框架代码,我不得不更改它以便它在运行时动态加载类、函数(和 block !)

    <

这是在 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);
}];
}

关于objective-c - AssetsLibrary 框架在 iOS 8 上损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26003211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com