Полученный файл существует в библиотеке фотографий
Мне нужно проверить, что полученный файл существует в библиотеке фотографий
Позвольте мне объяснить ниже
Я перенес / синхронизировал одну фотографию / видео из библиотеки фотографий с одного Ipad(отправителя) на другой Ipad(получатель) Photo Library через сеть Wi-Fi.
Я закончил это успешно.
Однако мне не нужны дубликаты файлов в библиотеке фотографий принимающего устройства.
Поэтому я создал строку MD5, которая всегда уникальна для файла (на стороне отправителя), и перед передачей файла отправил ее на сторону ученика.
На стороне получателя, после получения строки MD5 (полученной MD5) от Отправителя, я извлекаю все файлы библиотеки фотографий, используя библиотеку ALAsset, и создаю строку MD5 для каждого файла, что может занять больше времени. Сравнение каждой строки MD5 с полученным MD5 строка.
Если какой-либо файл MD5 библиотеки фотографий на стороне приемника равен принятому MD5, мы можем определить, что этот файл существует в библиотеке фотографий приемника.
Скорость процесса зависит от количества файлов в библиотеке фотографий.
Вышеуказанный процесс выполняется слишком медленно, если количество файлов в библиотеке фотографий превышает 100.
Так что я знаю, есть ли другой способ / способ сделать это. В основном мне нужно улучшить производительность. Пожалуйста, предоставьте мне лучшую концепцию.
мой код
-(void)getAllURLofPhotLibraryImages:(NSString*)receivedImageFileMd5 {
if(urlStoreArr == nil){
urlStoreArr = [[NSMutableArray alloc] init];
}
void (^assetEnumerator)(struct ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
if(result != NULL) {
NSLog(@"See Asset: %@", result);
// assets is a NSMutableArray..
// Here storing the asset's image URL's in NSMutablearray urlStoreArr
NSURL *url = [[result defaultRepresentation] url];
[urlStoreArr addObject:url];
NSLog(@"Adding all the Photolibrary URL's");
}
};
void (^assetGroupEnumerator)(struct ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop)
{
if(group != nil) {
[group enumerateAssetsUsingBlock:assetEnumerator];
}
else {
NSLog(@"going to check FileExistInPhotoLibrary");
[self CheckFileExistInPhotoLibrary:receivedImageFileMd5];
//call the method from here.
}
};
ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
[assetslibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos
usingBlock:assetGroupEnumerator
failureBlock: ^(NSError *error) {
NSLog(@"Failure");
}];
}
-(void)CheckFileExistInPhotoLibrary:(NSString *)receivedImageFileMd5{
if([urlStoreArr count] == 0){
NSLog(@"file is not exist in PhotoLibrary");
return;
}
int j = 1;
isFileFoundInPhotoLib = NO;
for(int counts =0;counts<[urlStoreArr count];counts++)
{
NSLog(@"entered in to for loop");
NSLog(@"%d",[urlStoreArr count]);
typedef void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *asset);
typedef void (^ALAssetsLibraryAccessFailureBlock)(NSError *error);
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
{
ALAssetRepresentation *rep = [myasset defaultRepresentation];
CGImageRef iref = [rep fullResolutionImage];
if (iref) {
UIImage *photLibraryImage = [UIImage imageWithCGImage:iref];
if(photLibraryImage){
NSData *imageData = UIImagePNGRepresentation(photLibraryImage);
NSString *photLibImageMd5 = [self md5Image:imageData];//creating MD5 string for receiver side phpto library images.
NSLog(@"photolib MD5::%@",photLibImageMd5);
NSLog(@"ReceivedImageMD5:%@",receivedImageFileMd5);
if([photLibImageMd5 isEqualToString:receivedImageFileMd5])
{
NSLog(@"file is exist in PhotoLibrary");
return;
}
if(j == [urlStoreArr count]){
NSLog(@"file is not exist in PhotoLibrary");
}
}
}
};
//
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror)
{
[self RequestForTheFile:fileTransferResponse];
NSLog(@"booya, cant get image - %@",[myerror localizedDescription]);
};
ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
[assetslibrary assetForURL:[urlStoreArr objectAtIndex:counts]
resultBlock:resultblock
failureBlock:failureblock];
j++;
}
if(urlStoreArr != nil){
[urlStoreArr release];
NSLog(@"urlstore array released");
urlStoreArr = nil;
}
}
// Метод создания строки Md5
-(NSString *) md5Image:(NSData *)data {
return [self md5:data];
}
- (NSString*)md5:(NSData *)data
{
unsigned char result[16];
CC_MD5( data.bytes, data.length, result ); // This is the md5 call
return [NSString stringWithFormat:
@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
];
}
1 ответ
Я предлагаю вам использовать SHA-1 для хеширования. Я считаю, что он быстрее, чем MD5, и вы не беспокоитесь о криптографической целостности, поскольку ничего не защищаете, а просто используете его для генерации уникального ключа.
Мой друг написал полезный вспомогательный класс, и они используют его в своем приложении ( Sandvox) по той же причине - чтобы увидеть, равны ли два файла.
Посмотрите на KSCrypto на GitHub.