gpt4 book ai didi

ios - 需要有关 dispatch_sync 和 dispatch_async 的帮助

转载 作者:行者123 更新时间:2023-11-28 22:31:59 24 4
gpt4 key购买 nike

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

[self dismissViewControllerAnimated:YES completion:^{}];

[self.navigationController.tabBarController.view addSubview:self.waitingView];

dispatch_queue_t currentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(currentQueue, ^{

self.originalImgFromPicker = [info objectForKey:UIImagePickerControllerOriginalImage];

CGSize size = self.originalImgFromPicker.size;
if (size.width > 320)
{
size.height /= (size.width / 320);
size.width = 320;
}

UIGraphicsBeginImageContext(size);
[self.originalImgFromPicker drawInRect:CGRectMake(0,0,size.width,size.height)];
self.resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.originalImgFromPicker = nil;

NSData *resizedImageBinary = UIImageJPEGRepresentation(self.resizedImage, 1.0);

self.resizedImageBinaryString = [NSString base64StringFromData:resizedImageBinary length:resizedImageBinary.length];

dispatch_sync(currentQueue, ^{
[self.waitingView removeFromSuperview];
});
});
}

我正在处理图像,在此期间我使用带有事件指示器的透明 View 来阻止 UI。

但是这个 self.waitingView 消失需要很长时间才能消失。

当图像处理正在进行时,UI 实际上被 self.waitingView 阻止,这意味着当我尝试点击背后的控件时没有任何效果,但是当异步 block 中的图像处理完成时 self。 waitingView 仍保留在屏幕上,当我尝试点击任何控件时它会响应。

如果我什么都不做,它需要一些时间才能消失。

我想以快速的方式执行此操作,我在代码中做错了什么?

最佳答案

UI操作应该在主队列中完成

修改代码

         dispatch_sync(currentQueue, ^{
[self.waitingView removeFromSuperview];
});

        dispatch_sync(dispatch_get_main_queue(), ^{
[self.waitingView removeFromSuperview];
});

所以你的方法应该是这样的

    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

[self dismissViewControllerAnimated:YES completion:^{}];

[self.navigationController.tabBarController.view addSubview:self.waitingView];

dispatch_queue_t currentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(currentQueue, ^{

self.originalImgFromPicker = [info objectForKey:UIImagePickerControllerOriginalImage];

CGSize size = self.originalImgFromPicker.size;
if (size.width > 320)
{
size.height /= (size.width / 320);
size.width = 320;
}

UIGraphicsBeginImageContext(size);
[self.originalImgFromPicker drawInRect:CGRectMake(0,0,size.width,size.height)];
self.resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.originalImgFromPicker = nil;

NSData *resizedImageBinary = UIImageJPEGRepresentation(self.resizedImage, 1.0);

self.resizedImageBinaryString = [NSString base64StringFromData:resizedImageBinary length:resizedImageBinary.length];

dispatch_sync(dispatch_get_main_queue(), ^{
[self.waitingView removeFromSuperview];
});
});
}

关于ios - 需要有关 dispatch_sync 和 dispatch_async 的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17161410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com