UIAlertView taking time to show

2019-08-07 16:15发布

问题:

I want to display an alert view on pressing a button. It is displayed but it takes too much time to be displayed on screen. here is the function that I am calling on pressing the button:

-(void)saveAndClose:(id)sender
{
    waitForOCR=[[UIAlertView alloc] initWithTitle:@"Processing..." message:@"Please wait." delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil, nil];
    waitForOCR.delegate=self;
    [waitForOCR show];
    if(!isCancelled){
    NSMutableArray *dateSaved=[[NSMutableArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] arrayForKey:@"dateCaptured"]];
    NSDateFormatter *dateText=[[NSDateFormatter alloc] init];
    [dateText setDateFormat:@"yyyy-MM-dd"];
    NSDate *now=[NSDate date];
    NSString *dateValue=[dateText stringFromDate:now];
    [dateSaved addObject:dateValue];
    NSMutableArray *timeSaved=[[NSMutableArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] arrayForKey:@"timeCaptured"]];
    NSDateFormatter *timeText=[[NSDateFormatter alloc] init];
    [timeText setDateFormat:@"HH:mm:ss"];
    NSString *timeValue=[timeText stringFromDate:now];
    [timeSaved addObject:timeValue];
    [[NSUserDefaults standardUserDefaults] setObject:dateSaved forKey:@"dateCaptured"];
    [[NSUserDefaults standardUserDefaults] setObject:timeSaved forKey:@"timeCaptured"];
    [dateSaved release];
    dateSaved=nil;
    [timeSaved release];
    timeSaved=nil;
    int counter = [[NSUserDefaults standardUserDefaults] integerForKey:@"LaunchesCounter"];
    counter++;
    [[NSUserDefaults standardUserDefaults] setInteger:counter forKey:@"LaunchesCounter"];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *localFilePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"image%d.png",counter]];
    NSData *thedata = [[NSData alloc] initWithData:UIImagePNGRepresentation(imageToCrop)];
    [thedata writeToFile:localFilePath atomically:YES];
    [thedata release];

    [NSThread detachNewThreadSelector:@selector(processOcrAt:) toTarget:self withObject:[self.imageCropper getCroppedImage]];
    }
    else{
        isCancelled=FALSE;
    }

}

As you can see that I am displaying UIAlerView at the start of the function. But it is taking too long to be displayed. Any suggestion to fix this issue? Thanks Regards Idrees

回答1:

The alert will only show up at the end of the current run loop, so everything you do right after "showing" it, will actually happen before. Note that it would be a good idea to move that code into the background anyway, as it will otherwise block the main thread and make the app unresponsive at best.



回答2:

Move [alertview show]; to the main queue. This is helpful if you intend to show an alert from an asynchronous callback.

dispatch_async(dispatch_get_main_queue(), ^{
    [alertview show];
});