2013-05-13 2 views
0

Я реализую код, который загружает изображения и сохраняет их в базе данных приложения,AFImageRequestOperation чтобы не асинхронный

У меня есть массив объектов, каждый объект содержит URL изображений и некоторую другую информацию. Чтобы загрузить изображения, я использую библиотеку классов AFImageRequestOperation.h AFNetworking.

Мой код загружает и сохраняет данные в базе данных, но должен уведомить пользователя, какое изображение загружено, например: если у меня есть массив, содержащий 5 объектов (приведенных чуть выше каждого объекта), придется выполнять загрузку тот же порядок, что и в массиве, но поскольку AFImageRequestOperation делает загрузку асинхронно, элемент 4 может быть загружен до первого элемента.

Короче говоря, я хочу иметь контроль и только выпуск для следующей загрузки, когда предыдущий закончен.

У меня есть для этого проходит через массив объектов и вызывает функцию для каждой позиции, функция имеет следующий код:

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[arrImagem valueForKey:@"urlimagem"]]]; 
    AFImageRequestOperation *operation = [AFImageRequestOperation imageRequestOperationWithRequest:request imageProcessingBlock:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image){ 

     Imagens *imagem = (Imagens *)[NSEntityDescription insertNewObjectForEntityForName:@"IMAGENS" inManagedObjectContext:managedObjectContext]; 

     // Save Image 
     NSData *imageData = UIImageJPEGRepresentation(image, 90); 
     [imagem setCategoria:cat]; 
     [imagem setTitulo:[arrImagem valueForKey:@"titulo"]]; 
     [imagem setDescricao:[arrImagem valueForKey:@"descricao"]]; 
     [imagem setImagem:imageData]; 



     NSError *error; 
     if(![managedObjectContext save:&error]){ 
      NSLog(@"houve um erro muito grave"); 
      //return false; 
     }else{ 
      NSLog(@"Salvou imagem"); 
     } 

    }failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error){ 
     NSLog(@"%@", [error localizedDescription]); 

    }]; 

    [operation start]; 

Я не знаю, если мой вопрос был очень ясен, но в основном мой вопрос похож на этот link

ответ

0

удалось решить мою проблему, извините за задержку при отправке решения, выполните следующий код:

dispatch_group_t group = dispatch_group_create(); 

     dispatch_group_enter(group); 

     NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:strUrl]]; 

     AFImageRequestOperation *operation = [AFImageRequestOperation imageRequestOperationWithRequest:request imageProcessingBlock:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image){ 

      //your implementation   

      dispatch_group_leave(group);  //<== NOTICE THIS 

     }failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error){ 
      //your implementation 

      NSLog(@"%@", [error localizedDescription]); 

     }]; 

     [operation start]; 

     dispatch_group_wait(group, DISPATCH_TIME_FOREVER); 

Таким образом, загрузочный обозреватель o, если этот код находится внутри случая, следующая загрузка будет вызываться только тогда, когда метод success ^: или fail ^: называется

0

AFImageRequestOperation является подклассом NSOperation, так что вы можете использовать:

- (void) addDependency: (NSOperation*) operation 

сделать S что одна операция заканчивается перед другой.

Например:

NSOperation *op1 = [[NSOperation alloc]init]; 
NSOperation *op2 = [[NSOperation alloc]init]; 

[op1 addDependency: op2]; 

Таким образом op1 не начнется до op2 закончена.

0

Вы можете создать метод в своем классе, где вы вызываете код загрузки и добавляете блок как параметр, который получает загруженный UIImage, URL-адрес изображения (и другую информацию, которая вам нужна), или вы можете реализовать делегат с тем же params из блока. Он может блокировать что-то вроде:

-(void)downloadImageWithSuccess:(void (^)(UIImage *image, NSString *url, OtherParms here))success 
         failure:(void (^)(NSError *error)failure { 
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[arrImagem valueForKey:@"urlimagem"]]]; 

    AFImageRequestOperation *operation = [AFImageRequestOperation imageRequestOperationWithRequest:request imageProcessingBlock:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image){ 
     Imagens *imagem = (Imagens *)[NSEntityDescription insertNewObjectForEntityForName:@"IMAGENS" inManagedObjectContext:managedObjectContext]; 

     // Save Image 
     NSData *imageData = UIImageJPEGRepresentation(image, 90); 
     [imagem setCategoria:cat]; 
     [imagem setTitulo:[arrImagem valueForKey:@"titulo"]]; 
     [imagem setDescricao:[arrImagem valueForKey:@"descricao"]]; 
     [imagem setImagem:imageData]; 

     NSError *error; 
     if(![managedObjectContext save:&error]){ 
      NSLog(@"houve um erro muito grave"); 
      //return false; 
     }else{ 
      NSLog(@"Salvou imagem"); 
     } 
     success(imagem, [request.URL absoluteString], otherParams); 

    }failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error){ 
     NSLog(@"%@", [error localizedDescription]); 
     failure(error); 

    }]; 

    [operation start]; 
} 

}

И при вызове метода из кода вы можете сделать что-то подобное (с использованием блоков):

[catalog downloadImageWithSuccess:^(UIImage *image, NSString *url, OtherParms here) { 
       //NOTIFY USER THAT THE IMAGE WITH URL HAS BEEN DOWNLOADED 
      } 
      failure:^(NSError *error) { 
       //NTOFIY USER THAT THE IMAGE FAILED 
      } 

]; 
+0

Хорошо, я попытался реализовать ваш код, поместить его внутри блока узнайте переданные параметры, если я положу эти параметры, например (void (^) (UIImage * image, NSString * url ... В рамках функции не может быть доступ к ним. понял, что вы имели в виду? – jucajl

+0

Извините, но я не понимаю, к чему вы не можете получить доступ: D. В каком методе вы не можете получить доступ к параметрам? – danypata

Смежные вопросы