Iphone 为什么调度组异步中的progressBar没有更改?

Iphone 为什么调度组异步中的progressBar没有更改?,iphone,ios,Iphone,Ios,我想在执行某些操作时显示进度条,但进度条没有更改。 我该怎么办 dispatch_group_t group = dispatch_group_create(); dispatch_queue_t queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); dispatch_group_async(group, queue, ^{ for (int i = 0; i < 100; i++) {

我想在执行某些操作时显示进度条,但进度条没有更改。 我该怎么办

dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

dispatch_group_async(group, queue, ^{
    for (int i = 0; i < 100; i++)
    {
        dispatch_group_async(group, dispatch_get_main_queue(),^{
            self.progressBar.progress = (float)i/100;
        });

        // do big somethings
    }
});

在最初的问题中,您将进度设置为0到100之间的整数。如果这是UIProgressView,那么进度是一个浮点,应该从0变为1.0

dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

dispatch_group_async(group, queue, ^{
    for (int i = 0; i < 100; i++)
    {
        dispatch_group_async(group, dispatch_get_main_queue(),^{
            self.progressBar.progress = ((CGFloat) i) / 100.0;
        });

        // do big somethings
    }
});
或者,更简单地说,由于您没有真正使用组,因此在全局队列上只有一个操作,并且在处理串行队列时,组通常是冗余的:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

dispatch_async(queue, ^{
    for (int i = 0; i < 100; i++)
    {
        dispatch_async(dispatch_get_main_queue(),^{
            self.progressBar.progress = ((CGFloat) i) / 100.0;
        });

        // do big somethings
    }
});

如果您仍然没有看到进度视图更新,那么它必须是一些简单的东西,比如没有正确连接的IBOutlet。确保self.progressBar不是零。尝试将其进度设置为0.5,并确保正确反映进度。

您应该更新主线程中的进度栏:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);

dispatch_async(queue, ^{

    // async stuff

    dispatch_sync(dispatch_get_main_queue(), ^{

        // sync stuff
    });
});

dispatch_release(queue);
我建议使用

dispatch_queue_t queue = dispatch_queue_create("com.company.myqueue", NULL);
更新进度状态,因为

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

是并发队列。

好的,代码中的进度已更改,但我想这并不重要。@dobiho您最近对答案的编辑看起来不错。如果你没有看到你的更新,那么我会怀疑你的IBOutlet。上面我的答案中的代码更新了进度视图。如果不适合您,那么它可能是一些简单的东西,比如IBOutlet。检查以确保self.progressBar不是nil。他正在使用主队列进行UI更新。此外,无需同步发送UI更新。如果前台队列被其他任务占用,为什么要冻结后台队列?dispatch_async通常更可取。正如@Rob指出的,这个答案并没有回答问题,给出了错误的建议。