UIButton repeated pressing

2019-07-21 11:25发布

I have a UITableViewCell and I have a UIButton in it. Each time I press the button, there is a network call and it updates a label (increments or decrements the count), something similar to the Facebook 'like' concept.

The problem is when the user repeatedly presses the UIButton, the values keep incrementing or decrementing. I tried toggling the userInteraction and also setting the setEnabled state. Still doesnt work.

I then tried using blocks as this link suggested. Still not working. I'm pretty new to blocks. Is there something I'm doing wrong here?

This is the implementation without blocks:

    - (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];

    }

Did the same thing with the block implementation:

- (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!");

}

1条回答
戒情不戒烟
2楼-- · 2019-07-21 11:56

The reason why disabling the button doesn't work is because it's a call to a UIKit object, which should be performed on the main thread. Basically, you don't know what thread the network delegate method is being called from (it's probably the background). Within the delegate method anything that has to do with UI should be sent to the main queue. In the method:

- (void) giveKarmaCheck:(BOOL)complete;

Wrap the UI calls in

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

Note the main queue and global queue are not the same.

查看更多
登录 后发表回答