- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
- (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/
请考虑以下代码: - (void)viewDidLoad { [super viewDidLoad]; dispatch_sync(dispatch_get_global_queue(
此代码阻塞了对 dispatch_sync 的调用。我是调度队列的新手。这会阻止什么原因? NSLog(@"%@",dispatch_get_current_queue()); NSLog(@"%@"
我有两个类,一个 View Controller 和另一个 (TwitterCrawler) 向 Twitter API 执行网络请求。我在加载 View Controller 时发出第一个网络请求,
以下代码中的死锁。为什么? dispatch_queue_t queue = dispatch_get_main_queue(); dispatch_async(queue, ^{ dispa
我正在研究 GCD 机制,我有几个问题。如果我的 Material 有误,请您纠正我,我将不胜感激。 1。问题) 据我所知,GCD 有 4 个具有不同优先级的全局并发队列。例如,当我们编写 DISPA
{ dispatch_queue_t myQueue = dispatch_queue_create("com.mycompany.myqueue", 0); dispatch_syn
是否可以杀死由于 dispatch_sync 而被锁定的线程?这是代码: dispatch_sync(q_, ^{ ... }); 这是锁定时的堆栈跟踪: #0 0x00007fff8d6995
我知道在串行队列上执行此操作会导致死锁,但我还没有发现任何提及在并发队列上执行此操作会导致死锁的内容。我只是想验证它不会死锁(它似乎不会,因为它只会阻塞队列中的一个线程,任务将在同一队列中的另一个线程
这个问题在这里已经有了答案: Why is this dispatch_sync() call freezing? (2 个答案) How to use background thread in s
我对读取共享资源时使用 dispatch_sync 有一些疑问。我在 Stack Overflow 上搜索了几个问题(例如:GCD dispatch_barrier or dispatch_sync?
我只是想确认为什么需要这样做。 我将此代码添加到 KIImagePager(一个 cocoapod)以加载应用本地的图像(默认代码从 url 加载图像)。 根据同事的建议,这是我的工作代码: disp
苹果文档说:(concurrencyProgrammingGuide,page49)重要提示:您永远不应从计划传递给函数的同一队列中执行的任务调用 dispatch_sync 或 dispatch_s
我知道这不是一个强有力的问题,但我必须弄清楚这个概念。 我定义了 myBlock 如下。 void(^myBlock)(void) = ^{ for(int i = 0;i < 10 ; i++
这是我需要做的。我希望 dispatch_sync 是使用 GCD 的最佳方式 我在 Appdelegate 的 applicationDidBecomeActive 回调中有一段临界区代码.. 我将
假设我从并发队列调用 dispatch_sync - 它会阻塞整个队列还是只阻塞那个执行线程? 最佳答案 dispatch_sync 会阻塞调用者线程直到执行完成,一个并发队列有多个线程所以它只会阻塞
我正在使用 dispatch_sync 执行一个 block ,并且该 block 已正确执行。但是这个 block 是在主线程上执行的。根据 Apple 文档: Serial queues (als
我遇到了一个场景,我有一个委托(delegate)回调,它可能发生在主线程或另一个线程上,直到运行时我才知道是哪个(使用 StoreKit.framework)。 我还有需要在回调中更新的 UI 代码
我最近在玩 UIDocument 并且混淆了 dispatch_sync/dispath_async 的概念 我有一个获取所有文档信息的方法 for (int i=0; i 所以 -openWithC
我有两个带有dispatch_sync的 block ,当第一个 block 结束时,我向用户显示窗口并开始运行第二个 block 。但在第二个 block 结束之前我不会单击屏幕上的任何按钮.. 看
我正在运行这段代码 dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ NSLog(@
我是一名优秀的程序员,十分优秀!