UIButton重复按下

我有一个UITableViewCell,我有一个UIButton。 每次按下button,都会有一个networking调用,它会更新一个标签(增加或减less计数),类似于Facebook的“概念”。

问题是当用户重复按下UIButton时,值不断递增或递减。 我试着切换userInteraction并设置setEnabled状态。 仍然没有工作。

然后我尝试使用块,因为这个链接build议。 还是行不通。 我很新的块。 有什么我在这里做错了吗?

这是没有块的实现:

- (void) giveKarmaCheck:(BOOL)complete // network delegate after the update { NSLog(@"Completed!"); _karmaBeingGiven = NO; NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] initWithDictionary:[[_questions objectForKey:@"questions"] objectAtIndex:_indexPath.section]]; int qKarma = [[tempDict objectForKey:@"qkarma"] integerValue]; NSString *karmaCountString; QXTHomeCell *questionCell = (QXTHomeCell*)[self.questionsTable cellForRowAtIndexPath:_indexPath]; if (_karmaGiven) { [tempDict setValue:[NSNumber numberWithInt:1] forKey:@"qkarmaStatus"]; qKarma++; [questionCell.karmaLogo setImage:[UIImage imageNamed:@"logo-black"]]; questionCell.karmaCount = [NSNumber numberWithInt:questionCell.karmaCount.integerValue + 1]; // Question Owner Karma NSMutableString *karmaLabelText = [[NSMutableString alloc] initWithString:@"Karma\n"]; karmaCountString = [NSString stringWithFormat:@"%d", [[[[_questions objectForKey:@"questions"] objectAtIndex:_indexPath.section] objectForKey:@"qownerkarma"]integerValue]+1]; [karmaLabelText appendString:karmaCountString]; questionCell.karmaLabel.text = karmaLabelText; } else { [tempDict setValue:[NSNumber numberWithInt:0] forKey:@"qkarmaStatus"]; qKarma--; [questionCell.karmaLogo setImage:[UIImage imageNamed:@"logo-grey"]]; questionCell.karmaCount = [NSNumber numberWithInt:questionCell.karmaCount.integerValue - 1]; // Question Owner Karma NSMutableString *karmaLabelText = [[NSMutableString alloc] initWithString:@"Karma\n"]; karmaCountString = [NSString stringWithFormat:@"%d", [[[[_questions objectForKey:@"questions"] objectAtIndex:_indexPath.section] objectForKey:@"qownerkarma"]integerValue]-1]; [karmaLabelText appendString:karmaCountString]; questionCell.karmaLabel.text = karmaLabelText; } NSLog(@"Count *** %@", karmaCountString); NSMutableArray *tempAnswerArray = [[NSMutableArray alloc] initWithArray:[_questions objectForKey:@"questions"]]; NSMutableDictionary *tempAnswerDict = [[NSMutableDictionary alloc] initWithDictionary:[tempAnswerArray objectAtIndex:_indexPath.section]]; [tempAnswerDict setValue:karmaCountString forKey:@"qownerkarma"]; [tempAnswerArray replaceObjectAtIndex:_indexPath.section withObject:tempAnswerDict]; // NSLog(@"Array %@", tempAnswerDict); [_questions setObject:tempAnswerArray forKey:@"questions"]; NSLog(@"Total %@ Count %d", [[_questions objectForKey:@"questions"] objectAtIndex:_indexPath.section], [[[_questions objectForKey:@"questions"] objectAtIndex:_indexPath.section] count]); [tempDict setValue:[NSNumber numberWithInt:qKarma] forKey:@"qkarma"]; [[_questions mutableArrayValueForKey:@"questions"] replaceObjectAtIndex:_indexPath.section withObject:tempDict]; NSMutableString *withoutCount = [[NSMutableString alloc] initWithString:[QXTUtility removeLastWord:questionCell.karmaButton.titleLabel.text]]; [withoutCount appendString:[NSString stringWithFormat:@" %d", questionCell.karmaCount.integerValue]]; [questionCell.karmaButton setTitle:[QXTUtility stripDoubleSpaceFrom:withoutCount] forState:UIControlStateNormal]; [questionCell.karmaButton setUserInteractionEnabled:YES]; } 

块的实现是一样的:

 - (void) giveKarmaCheck:(BOOL)complete { QXTHomeCell *questionCell = (QXTHomeCell*)[self.questionsTable cellForRowAtIndexPath:_indexPath]; [questionCell.karmaButton setEnabled:NO]; __block NSMutableString *karmaLabelText, *withoutCount; dispatch_async(dispatch_get_global_queue(0,0), ^{ NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] initWithDictionary:[[_questions objectForKey:@"questions"] objectAtIndex:_indexPath.section]]; int qKarma = [[tempDict objectForKey:@"qkarma"] integerValue]; NSString *karmaCountString; if (_karmaGiven) { [tempDict setValue:[NSNumber numberWithInt:1] forKey:@"qkarmaStatus"]; qKarma++; // Question Owner Karma karmaLabelText = [[NSMutableString alloc] initWithString:@"Karma\n"]; karmaCountString = [NSString stringWithFormat:@"%d", [[[[_questions objectForKey:@"questions"] objectAtIndex:_indexPath.section] objectForKey:@"qownerkarma"]integerValue]+1]; [karmaLabelText appendString:karmaCountString]; } else { [tempDict setValue:[NSNumber numberWithInt:0] forKey:@"qkarmaStatus"]; qKarma--; // Question Owner Karma NSMutableString *karmaLabelText = [[NSMutableString alloc] initWithString:@"Karma\n"]; karmaCountString = [NSString stringWithFormat:@"%d", [[[[_questions objectForKey:@"questions"] objectAtIndex:_indexPath.section] objectForKey:@"qownerkarma"]integerValue]-1]; [karmaLabelText appendString:karmaCountString]; } NSMutableArray *tempAnswerArray = [[NSMutableArray alloc] initWithArray:[_questions objectForKey:@"questions"]]; NSMutableDictionary *tempAnswerDict = [[NSMutableDictionary alloc] initWithDictionary:[tempAnswerArray objectAtIndex:_indexPath.section]]; [tempAnswerDict setValue:karmaCountString forKey:@"qownerkarma"]; [tempAnswerArray replaceObjectAtIndex:_indexPath.section withObject:tempAnswerDict]; // NSLog(@"Array %@", tempAnswerDict); [_questions setObject:tempAnswerArray forKey:@"questions"]; NSLog(@"Total %@ Count %d", [[_questions objectForKey:@"questions"] objectAtIndex:_indexPath.section], [[[_questions objectForKey:@"questions"] objectAtIndex:_indexPath.section] count]); [tempDict setValue:[NSNumber numberWithInt:qKarma] forKey:@"qkarma"]; [[_questions mutableArrayValueForKey:@"questions"] replaceObjectAtIndex:_indexPath.section withObject:tempDict]; withoutCount = [[NSMutableString alloc] initWithString:[QXTUtility removeLastWord:questionCell.karmaButton.titleLabel.text]]; [withoutCount appendString:[NSString stringWithFormat:@" %d", questionCell.karmaCount.integerValue]]; dispatch_async(dispatch_get_main_queue(), ^{ [questionCell.karmaButton setEnabled:YES]; if (_karmaGiven) { [questionCell.karmaLogo setImage:[UIImage imageNamed:@"logo-black"]]; questionCell.karmaCount = [NSNumber numberWithInt:questionCell.karmaCount.integerValue + 1]; questionCell.karmaLabel.text = karmaLabelText; } else { [questionCell.karmaLogo setImage:[UIImage imageNamed:@"logo-grey"]]; questionCell.karmaCount = [NSNumber numberWithInt:questionCell.karmaCount.integerValue - 1]; questionCell.karmaLabel.text = karmaLabelText; } [questionCell.karmaButton setTitle:[QXTUtility stripDoubleSpaceFrom:withoutCount] forState:UIControlStateNormal]; }); }); NSLog(@"Completed!"); } 

禁用button的原因不起作用是因为它是对UIKit对象的调用,应该在主线程上执行。 基本上,你不知道什么线程networking委托方法被调用(这可能是背景)。 在委托方法中,任何与UI有关的事情都应该被发送到主队列中。 在该方法中:

 - (void) giveKarmaCheck:(BOOL)complete; 

包装UI调用

 dispatch_async(dispatch_get_main_queue(), ^{ // Do UI stuff on this thread }); 

注意主队列和全局队列是不一样的。