- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个在后台运行的 GCD
。我有一个按钮,当按下它时,我希望它在 GCD 完成时加载加载等待屏幕,然后执行该按钮上的其余代码。附件是样本。
我的不工作,我基本上想说,等待完成 GCD 所需的时间,同时加载等待消息,完成后继续代码。
谢谢
- (IBAction)btnTapped:(id)sender
{
shouldCancel=NO;
dispatch_queue_t existingQueque = dispatch_get_main_queue();//finds the current GCD, the one I created in a different method
dispatch_group_t group =dispatch_group_create();
dispatch_group_async(group, existingQueque, ^
{
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);//does not work, I guess group can't be created here.
[self performSelectorOnMainThread:@selector(showWaitViewWithMessage:) withObject:@"Loading" waitUntilDone:YES];//load this until GCD queque done
[self performSelector:@selector(performSearch) withObject:nil afterDelay:0];
});
}
最佳答案
几个想法:
您建议 dispatch_get_main_queue()
“找到当前 GCD,即我用不同方法创建的 GCD”。不,这只是获取主队列(如果您使用它,将阻塞您的用户界面的队列),而不是您通过 dispatch_create_queue
在别处创建的队列。 dispatch_get_main_queue()
只是获取主队列,当您进行搜索时,您的 UI 将被阻止(例如,UIActivityIndicatorView
不会旋转,无论如何)。
如果您已将一大堆任务分派(dispatch)到后台队列,如果您想等待所有任务完成,那就是使用 dispatch_group_t
或 dispatch_barrier
,但鉴于您所展示的内容并不需要(您只有一个已分派(dispatch)的操作),您就不需要去那里。顺便说一句,如果您使用的是全局队列,则不建议使用障碍。
单个 GCD 后台任务的典型模式比您的问题所暗示的更简单。您 (a) 更新您的用户界面以显示“正在加载”并显示 UIActivityIndicatorView
或类似的东西,这样用户就有了更丰富的用户体验,向他们表明该应用正在处理某事; (b) 在后台发送搜索; (c) 完成后,将 UI 更新分派(dispatch)回主队列。因此,典型的模式是:
- (IBAction)btnTapped:(id)sender
{
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// or, if you've already created you own background queue just use that here,
// or just create one here. But don't use dispatch_get_main_queue, as that
// won't use a background queue.
//
// dispatch_queue_t backgroundQueue = dispatch_queue_create("org.yourdomain.yourapp.search", NULL);
[self showWaitViewWithMessage:@"Loading"];
dispatch_async(backgroundQueue, ^{
[self performSearch]; // do this in the background
dispatch_async(dispatch_get_main_queue(), ^{
[self updateUiAfterSearch]; // when done, dispatch UI update back to main queue
});
});
// if you created a queue, remember to release it
//
// dispatch_release(backgroundQueue);
}
顺便说一句,在您的performSelectorOnMainThread
中,我认为没有理由waitUntilDone
。除非有一些令人信服的理由,否则不要等待。正如您在上面看到的,根本不需要此构造,仅供引用。
顺便说一下,重要的是要知道许多服务器对给定客户端一次可以发出的并发请求数施加限制。如果您可能会发起多个请求(例如,用户点击按钮并且服务器响应缓慢)并且这允许它们同时运行。在这种情况下,值得追求 NSOperationQueue
,您可以在其中设置 maxConcurrentOperationCount
。如果您使用 NSOperationQueue
方法的 block 版本(例如 addOperationWithBlock
而不是 GCD 的 dispatch_async
),代码可以以相同的方式构建,但它可以让您限制后台操作的数量。
此外,NSOperationQueue
提供了在操作之间轻松建立依赖关系的能力(例如,一个完成 NSOperation
依赖于所有其他完成)。我可以概述一下,但您发布的代码并不一定要这样,所以除非您让我知道您想看看它会是什么样子,否则我会省去您的麻烦。
关于ios - 在新代码之前等待 GCD 异步停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14062740/
环境: Ubuntu 16.04 64 位 g++ 5.4.0 版 这是代码: #include ... auto g = std::gcd(10, 4); ... 我在编译命令中开启了-std=c
我正在尝试用 Python 编写欧几里得算法。它是找到两个非常大的数字的 GCD。公式是 a = bq + r 其中 a 和 b 是你的两个数,q 是 b 均分 a 的次数,r 是余数。 我可以编写代
我正在尝试创建一个处理非常大数字的 gcd 函数。因此,到目前为止我尝试过的任何事情都会导致错误。例如 : fun gcd(a : Int.toLarge, b : Int.toLarge): Int
我是 Haskell 的新手,实际上我才刚开始,我想对我将要问的问题有一点提示。 我目前正在尝试获取给定列表的 GCD。例如,列表 [3, 6, 9] 将返回 3。 目前,我想到了以下方法,我是否朝着
我有一段来自 API 黑暗时代的现有代码。它是一个基于 MPCreateTask 的线程。看起来我可以将其移至 GCG 队列,但有点复杂。当前有三个基于 MPCreateQueue 的队列用于三个优先
出于多种原因,我想让我的应用程序向后兼容 OS X 10.5。 到目前为止,我正在使用 10.6 中添加的大量 GCD 调度队列,如下所示: dispatch_async(dispatch_get_m
我有一个在一些设备上崩溃的 iOS 应用程序。鉴于发生这种情况时我在 iTunes 上看到的差评,崩溃似乎发生在代码中的同一点。 最后,一位好心人实际上联系了我,而不仅仅是留下评论,他们甚至为我安装了
我有一个定期运行的任务,它最初设计为使用 NSThread 和 NSTimer 在与主运行循环不同的单独运行循环上运行。 适应这一点以利用 GCD 的最佳方法是什么? 当前代码: -(void)ini
我想知道这两者之间的性能差异是什么。 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
我研究过 GCD 和线程安全。在苹果文档中,GCD 是线程安全的,即多线程可以访问。而且我了解了线程安全的含义,即每当多个线程访问某个对象时总是给出相同的结果。 我认为 Thread-Safe 和 G
我需要帮助来获取两个输入数字的 GCD。我不知道为什么它不会返回 GCD。例如,55 和 125 的 GCD 将为 5。任何帮助将不胜感激。它必须使用方法,而不是算法。 public static v
几天前我在编程挑战中遇到了这个问题。 在后端的 20 个测试用例中,我只得到了一个通过。这是我的解决方案 import java.util.Scanner; class TestClass {
我研究过 GCD 和线程安全。在苹果文档中,GCD 是线程安全的,即多线程可以访问。而且我了解了线程安全的含义,即每当多个线程访问某个对象时总是给出相同的结果。 我认为 Thread-Safe 和 G
我有一种方法可以帮助我将本地standardUserDefaults与Web服务同步。首先,我需要确保数据已成功同步,然后才能让该方法返回。我目前正在努力解决的问题是,我无法让GCD按特定顺序执行并完
我必须确保 3 个数字之间的 GCD 不大于 1。 这是我迄今为止该方法的代码: private int greatestCommonFactor(int a, int b, int c) {
我有两种在串行队列上运行的方法。每个方法都返回某个类的副本。我试图在保持数据完整性的同时实现线程安全解决方案。 例如: -(Users *) getAllUsers { __block
假设我们有一个 UIVewcontroller,叫它 A,在那个 VC 的 viewdidload 中我们添加两个 UIViewcontrollers(B,C)。现在为了使 A 的 Viewdidlo
我有几个任务被分派(dispatch)到串行队列,特别是一些被分派(dispatch)到组的任务。在调度这些任务后,我想给用户取消它们的选项,即使它们已经被执行。 我找不到任何方法来取消排队的任务,然
因此,我使用 dispatch_async 将 10 个任务放入并发队列中。它们不会阻塞下一个任务,并按顺序处理。我的 UI 具有响应能力。 for (int i = 0; i < 10; i++)
public static int divisor(int m, int n) { if (m == 0 || n == 0) { return m+n; } else
我是一名优秀的程序员,十分优秀!