ios UIAlertView: haz alerta esperando mi respuesta

Posible duplicado:
Hacer el locking UIAlertView

He estado golpeando mi cabeza contra la panetworking por horas en este.

Esto es lo que tengo: OrderDetailsViewController se establece como un UIAlertViewDelegate

Tengo un procedimiento que recibe información de un formulario de búsqueda. Verifica si el artículo ya está en el pedido y si no continúa agregando los artículos. Si ve un duplicado, aparece un UIAlertView preguntando qué quiere hacer el usuario: hay 3 opciones, "Combinar": agregue la cantidad nueva al elemento anterior, "Agregue" el duplicado como una línea separada o " Cancelar "arrojar el nuevo elemento. Necesito que espere una respuesta del UIAlertView para poder continuar agregando el duplicado o tirar el duplicado: el "Combinar" se maneja en el delegado, pero todavía necesito una respuesta para el procedimiento principal.

Esto es lo que tengo hasta ahora:

- (void)returnItemAndQty:(ProductsSearchController *)productsSearchController withItemsToAdd:(NSMutableArray *)itemsToAdd withQty:(NSDictionary *)qtyToAdd andClose:(BOOL)close { if ([itemsToAdd count] == 0) { return; } Items *items; for (int index = 0; index < [itemsToAdd count]; index++) { items = [itemsToAdd objectAtIndex:index]; qtyAddedToOrder = [NSDecimalNumber decimalNumberWithString:[qtyToAdd objectForKey:items.ItemCode]]; NSLog(@"Item Code: %@", items.ItemCode); NSLog(@"Qty: %@", [qtyToAdd objectForKey:items.ItemCode]); NSError *error; //For handling duplicate items. . . duplicateItemDisposition = -1; //Reset the dispostion for normal operation if([self isItemOnOrder:items.ItemCode]) { int i = [self itemIsAlreadyOnOrder:itemAlreadyOnOrder withQty:qtyAddedToOrder]; if (i == COMBINE || i == CANCEL){ //either Cancel or Combine was pressed. items.Checked = NO; if (![items.managedObjectContext save:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); } continue; } } //Add the new item or duplicate if that's what you want OrdersDetails *newOrderDetail = [NSEntityDescription insertNewObjectForEntityForName:@"OrdersDetails" inManagedObjectContext:self.managedObjectContext]; .//more code snipped, that handles the "ADD" or non-dupe . . 

Aquí es donde testing para un duplicado. . .

 - (BOOL)isItemOnOrder:(NSString *)itemCode { NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"OrdersDetails" inManagedObjectContext:managedObjectContext]; [request setEntity:entity]; NSSortDescriptor *sort = [[NSSortDescriptor alloc]initWithKey:@"Desc1" ascending:NO]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sort, nil]; [request setSortDescriptors:sortDescriptors]; [sort release]; [sortDescriptors release]; NSPnetworkingicate *pnetworking = [NSPnetworkingicate pnetworkingicateWithFormat:@"(ItemCode=%@ AND OrderID=%@)", itemCode, orders.OrderID]; [request setPnetworkingicate:pnetworking]; NSError *error; NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:& error] mutableCopy]; [request release]; if (mutableFetchResults == nil) { itemAlreadyOnOrder = nil; return NO; }else if ([mutableFetchResults count] > 0){ itemAlreadyOnOrder = [mutableFetchResults objectAtIndex:0]; return YES; }else{ itemAlreadyOnOrder = nil; return NO; } } 

Aquí es donde ve que existe un engaño y el delegado de UIAlertview lo hace. . .

 - (int) itemIsAlreadyOnOrder:(OrdersDetails *)existingOrderDetail withQty:(NSDecimalNumber *)qty { if (existingOrderDetail == nil) { return -1; } UIAlertView *duplicateAlert = [[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"Duplicate Item %@ found.",existingOrderDetail.ItemCode] message:@"Tap Combine to combine the items, Tap Add to add the duplicate item or Tap Cancel to discard the duplicate" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Combine", @"Add", nil]; [duplicateAlert show]; return duplicateItemDisposition; [duplicateAlert release]; } - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { // Cancel = 0, Combine = 1, Add = 2 if (buttonIndex == CANCEL){ duplicateItemDisposition = CANCEL; }else if (buttonIndex == COMBINE){ duplicateItemDisposition = COMBINE; NSDecimalNumber *existingQty = [[NSDecimalNumber alloc] initWithDecimal:[itemAlreadyOnOrder.Qty decimalValue]]; NSDecimalNumber *existingPrice = itemAlreadyOnOrder.Price; NSDecimalNumber *newQty = [existingQty decimalNumberByAdding:qtyAddedToOrder]; itemAlreadyOnOrder.ExtPrice = [newQty decimalNumberByMultiplyingBy:existingPrice]; [existingQty release]; NSError *error; if (![itemAlreadyOnOrder.managedObjectContext save:&error]){ NSLog(@"Error saving. %@, %@", error, [error userInfo]); [self handleFreeGoods:itemAlreadyOnOrder]; }else if (buttonIndex == ADD){ duplicateItemDisposition = ADD; } } 

Ahora leo algo sobre usar una NS Condition en un hilo de background, pero no tengo idea de lo que eso significa. Miré a NS Condition, y fue less que esclarecedor.

¿Alguna idea sobre cómo detener la ejecución?

UIAlertView no puede bloquear, ya que se muestra al final del runloop. En lugar de tener el método itemIsAlreadyOnOrder: devuelve un valor que indica qué debe hacerse con la input duplicada, el método delegado de UIAlertView debe notificar a su controller que el elemento en cuestión se ha resuelto. Realice un seguimiento del object en cuestión en algún lugar ( _objectToVerify o algo por el estilo), y en el método de delegado de la llamada UIAlertView un método basado en la elección de los usuarios, que actuará en ese _objectToVerify .

No sé cuánto podría cambiar su layout actual, pero el patrón de layout de Cocoa tendría el método que activa la alerta, no devolverá nada, por lo que algo así como if (duplicate) showAlertView en pseudocódigo. Luego, en el delegado de la vista de alerta, llame a un método que realmente maneje el procesamiento del duplicado en function de la input del usuario.