Сбой приложения при получении ALAssets из группы ALAssetsGroupSavedPhotos при получении ALAssetsLibraryChangedNotification
Часть моего приложения имеет браузер фотографий, похожий на приложение Apple для фотографий (Grid like view). Чтобы обновить мои фотографии, когда в оригинальном приложении для фотографий есть какие-либо изменения, я зарегистрировался для ALAssetsLibraryChangedNotification
self.assetsLibrary = [[ALAssetsLibrary alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveLibraryChangedNotification:) name:ALAssetsLibraryChangedNotification object:self.assetsLibrary];
В методе receiveLibraryChangedNotification - я проверяю, есть ли у userInfo ALAssetLibraryUpdatedAssetsKey, а затем вызываю метод обновления фотографий.
- (void) receiveLibraryChangedNotification:(NSNotification *) notif{
NSDictionary *userInfo = [notif userInfo];
if(userInfo){
id updatedAssets = [userInfo objectForKey:ALAssetLibraryUpdatedAssetsKey];
if(updatedAssets){
[self refreshPhotos];
}
}
- (void) refreshPhotos {
self.assetArray = nil;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^(void){
[self.assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if(group){
[group enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [group numberOfAssets])] options:0 usingBlock:^(ALAsset *result, NSUInteger index, BOOL *shouldStop) {
if(result){
if([[result valueForProperty:@"ALAssetPropertyType"] isEqualToString:@"ALAssetTypePhoto"]){
[self.assetArray addObject:result];
}
}
}];
}
} failureBlock:^(NSError *error) {
DebugLog(@"error >>> %@",[error description]);
}];
});
}
Проблема, с которой я сталкиваюсь, заключается в том, что несколько раз уведомление запускается несколько раз, и приложение вылетает в
[self.assetArray addObject:result];
с ошибкой -
malloc: *** error for object 0x4aa9000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
или же
malloc: *** error for object 0x16fd3e74: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
также иногда я не получаю ALAssetLibraryUpdatedAssetsKey в userInfo уведомления, поэтому фотографии никогда не обновляются.
Кто-нибудь может направить меня в правильном направлении.
Заранее спасибо.
1 ответ
ассигновать self.assetArray
после nil
назначение или запись [self.assetArray removeAllObjects]
вместо того, чтобы назначить его nil
,
- (void) refreshPhotos {
self.assetArray = nil;
self.assetArray = [[NSMutableArray alloc] init];
//or remove the top 2 lines and try `[self.assetArray removeAllObjects]`
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^(void){
[self.assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if(group){
[group enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [group numberOfAssets])] options:0 usingBlock:^(ALAsset *result, NSUInteger index, BOOL *shouldStop) {
if(result){
if([[result valueForProperty:@"ALAssetPropertyType"] isEqualToString:@"ALAssetTypePhoto"]){
[self.assetArray addObject:result];
}
}
}];
}
} failureBlock:^(NSError *error) {
DebugLog(@"error >>> %@",[error description]);
}];
});
}
также иногда я не получаю ALAssetLibraryUpdatedAssetsKey в пользовательской информации уведомления,
есть четыре ключа, используемые для получения значений из словаря информации пользователя ALAssetsLibraryChangedNotification
уведомление.
NSString * const ALAssetLibraryUpdatedAssetsKey;
NSString * const ALAssetLibraryInsertedAssetGroupsKey;
NSString * const ALAssetLibraryUpdatedAssetGroupsKey;
NSString * const ALAssetLibraryDeletedAssetGroupsKey;