了打我的头靠在墙上的这一个小时。
下面是我得到了什么:OrderDetailsViewController被设置为UIAlertViewDelegate
我有一个接收信息传回从一个搜索表单的过程。它检查项目是否已经在订单上,如果没有继续添加项目。如果它看到一个副本,它会弹出一个UIAlertView中询问用户想要做什么:有3个选项,“组合” - 新的数量增加了老项目,“添加”副本作为一个单独的项目,或者“取消“扔掉新物品。我需要它等待来自UIAlertView的回答,以便我可以继续添加该投掷物或扔掉投掷物 - “组合”由代表处理,但我仍然需要主程序的答案。
这是我到目前为止有:
- (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
.
.
在此处,它测试的重复。 。 。
- (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];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"(ItemCode=%@ AND OrderID=%@)", itemCode, orders.OrderID];
[request setPredicate:pred];
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;
}
}
这里就是它看到愚弄的人存在,它的UIAlertView中委托。 。 。
- (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;
}
}
现在我读了一些关于在后台线程中使用NSCondition的内容,但我不知道这意味着什么。我抬头看了一下NSCondition,它不如启发。
有关如何暂停执行任何想法?
你上的NSOperation或后台执行一些其他的方法进行一些工作?你试图“暂停”什么? – RyanR
我不是。我基本上只是试图让代码等待来自UIAlertView的响应,然后再继续。我没有使用任何后台执行或多线程。 –