Полученный файл существует в библиотеке фотографий - PullRequest
2 голосов
/ 07 сентября 2011

Мне нужно убедиться, что полученный файл существует в библиотеке фотографий

Позвольте мне объяснить ниже

Я перенес / синхронизировал одну фотографию / видео из библиотеки фотографий с одного Ipad (отправителя) на другой Ipad(получатель) Библиотека фотографий через сеть Wifi.

Я успешно завершил ее.

Однако мне не нужны дубликаты файлов в библиотеке фотографий принимающего устройства.

Итак, я создалстрока MD5, которая всегда уникальна для файла (на стороне отправителя) и отправляется на сторону учащегося перед передачей файла.

На стороне получателя, после получения строки MD5 (полученной MD5) от Отправителя, яЯ извлекаю все файлы библиотеки фотографий с помощью библиотеки ALAsset и создаю строку MD5 для каждого файла, что может занять больше времени. Сравнение каждой строки MD5 с полученной строкой MD5.

Если есть какой-либо файл библиотеки фотографий на стороне получателя MD5равно полученному MD5, мы можем определить, что файл существует в библиотеке фотографий получателя.

Скорость процесса is связано с количеством файлов в библиотеке фотографий.

Вышеуказанный процесс выполняется слишком медленно, если количество файлов в библиотеке фотографий превышает 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 Ответ

1 голос
/ 07 сентября 2011

Я предлагаю вам использовать SHA-1 для хеширования.Я полагаю, что он быстрее, чем MD5, и вы не беспокоитесь о криптографической целостности, поскольку ничего не защищаете, просто используете его для генерации уникального ключа.

Мой друг написал полезный вспомогательный класс, и онииспользуйте его в своем приложении ( Sandvox ) по той же причине - чтобы увидеть, равны ли два файла.

Посмотрите на KSCrypto на GitHub.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...