ios 6.0.1 ALAssetsLibraryChangedNotification, пытаясь понять, что отправляется
Я работал с ALAssetsLibraryChangedNotification в iOS 6.x (6.0.1 конкретно на данный момент), и я получаю результаты, противоречащие тому, что я ожидал бы получить в моем userinfo, основываясь на том, что я понимаю из документации.
Вот мой код для регистрации событий:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(assetsLibraryDidChange:) name:ALAssetsLibraryChangedNotification object:_library];
Чтобы проверить, я иду в свою библиотеку фотографий и удаляю некоторые элементы, добавляю некоторые элементы.
Вот мой куратор.
- (void)assetsLibraryDidChange:(NSNotification *)note
{
NSDictionary* info = [note userInfo];
NSLog(@"assetsLibraryDidChange calling syncPhotoInfoFromAssets, userInfo %@", info);
// If the user information dictionary is nil, reload all assets and asset groups.
if(note.userInfo==nil) {
[self syncPhotoInfoFromAssets];
return;
}
// If the user information dictionary an empty dictionary, there is no need to reload assets and asset groups.
if(note.userInfo.count == 0) {
return;
}
// If the user information dictionary is not empty, reload the effected assets and asset groups. For the keys used, see “Notification Keys.”
NSSet *updatedAssets = [info objectForKey:ALAssetLibraryUpdatedAssetsKey];
NSSet *updatedAssetGroup = [info objectForKey:ALAssetLibraryUpdatedAssetGroupsKey];
NSSet *deletedAssetGroup = [info objectForKey:ALAssetLibraryDeletedAssetGroupsKey];
NSSet *insertedAssetGroup = [info objectForKey:ALAssetLibraryInsertedAssetGroupsKey];
NSLog(@"updated assets:%@", updatedAssets);
NSLog(@"updated asset group:%@", updatedAssetGroup);
NSLog(@"deleted asset group:%@", deletedAssetGroup);
NSLog(@"inserted asset group:%@", insertedAssetGroup);
//further processing here
}
Мои выходные данные:
ALAssetLibraryUpdatedAssetGroupsKey = "{(n assets-library://group/?id=736B6346-6DA2-4E43-8830-9C263B2D29EDn)}";
ALAssetLibraryUpdatedAssetsKey = "{(n assets-library://asset/asset.JPG?id=A695208B-3546-4CCA-B539-B1D132A209B3&ext=JPGn)}";
}
2013-01-06 22:50:45.738 Olesi[25468:3613] updated assets:{(
assets-library://asset/asset.JPG?id=A695208B-3546-4CCA-B539-B1D132A209B3&ext=JPG
)}
2013-01-06 22:50:45.738 Olesi[25468:3613] updated asset group:{(
assets-library://group/?id=736B6346-6DA2-4E43-8830-9C263B2D29ED
)}
2013-01-06 22:50:45.739 Olesi[25468:3613] deleted asset group:(null)
2013-01-06 22:51:06.658 Olesi[25468:3613] inserted asset group:(null)
После удаления и вставки альбом, я ожидаю, что получил данные как в Alassetlibrarydeletedassetgroupskey, так и в ALAssetLibraryInsertedAssetGroupskey, и ничего ни в одном из ключей ALAssetLibraryUpdatedAsset*. Есть идеи? Я замечаю, что даже пример кода Apple, который слушает это уведомление, даже не использует ключи, а скорее пересчитывает все активы независимо от конкретного ключа (который пахнет так, как будто они не доверяют информации уведомления)
1 ответ:
Если у вас нет ссылки на удаляемую группу, ОС не сообщит вам об этом.
Я получаю правильное поведение, используя следующий код:
Обратите внимание, что я получаю уведомление только для группы, которая назначена для себя.currentAssetGroup.#import "ROBKViewController.h" #import <AssetsLibrary/AssetsLibrary.h> @interface ROBKViewController () @property (nonatomic, strong) ALAssetsLibrary *assetsLibrary; @property (nonatomic, strong) ALAssetsGroup *currentAssetGroup; - (void) handleAssetChangedNotifiation:(NSNotification *)notification; @end @implementation ROBKViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { _assetsLibrary = [ALAssetsLibrary new]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAssetChangedNotifiation:) name:ALAssetsLibraryChangedNotification object:_assetsLibrary]; } return self; } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self name:ALAssetsLibraryChangedNotification object:nil]; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self.assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) { } failureBlock:^(NSError *error) { }]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - Notification handlers - (void) handleAssetChangedNotifiation:(NSNotification *)notification { NSLog(@"notification: %@", notification); if ([notification userInfo]) { NSSet *insertedGroupURLs = [[notification userInfo] objectForKey:ALAssetLibraryInsertedAssetGroupsKey]; NSURL *assetURL = [insertedGroupURLs anyObject]; if (assetURL) { [self.assetsLibrary groupForURL:assetURL resultBlock:^(ALAssetsGroup *group) { self.currentAssetGroup = group; } failureBlock:^(NSError *error) { }]; } } } @end