Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c UIProgressBar不是';t在循环中更新_Objective C_Uiprogressbar - Fatal编程技术网

Objective c UIProgressBar不是';t在循环中更新

Objective c UIProgressBar不是';t在循环中更新,objective-c,uiprogressbar,Objective C,Uiprogressbar,以前有人问过这个问题,但答案不起作用。我知道(如果我错了,请纠正我)主线程会更新UI,因此我们需要在循环中调用主线程。我正在尝试,进度条只在循环结束时更新(因此从0%到100%) 这是我的密码 h @界面ViewController:UIViewController{ IBUIProgressView*进度条; 浮动百分比; } -(iAction)按钮:(id)发送方; @结束 m -(iAction)按钮:(id)发送者{ 对于(intz=0;z

以前有人问过这个问题,但答案不起作用。我知道(如果我错了,请纠正我)主线程会更新UI,因此我们需要在循环中调用主线程。我正在尝试,进度条只在循环结束时更新(因此从0%到100%)

这是我的密码

h

@界面ViewController:UIViewController{
IBUIProgressView*进度条;
浮动百分比;
}
-(iAction)按钮:(id)发送方;
@结束
m

-(iAction)按钮:(id)发送者{
对于(intz=0;z<9;z++){
//做事
浮动百分比=(1.0/9.0*(z+1));
[self-performSelectorOnMainThread:@selector(makeMyProgressBarMove),对象为nil waitUntilDone:NO];
}
}
-(void)makeMyProgressBarMove{
[进度条设置进度:进度条百分比:是];
}
在调试模式下运行时,我注意到当它到达行
[self-performSelectorOnMainThread:@selector(makeMyProgressBarMove)with-Object:nil waitUntilDone:NO]它只是重新启动循环,而不转到1makeMyProgressBarMove:`

另外,
//do stuff
部分并不短,当按下按钮时,运行代码实际上需要5秒,所以它不像更新得那么快,我看不到它

谢谢,如果需要更多信息,请告诉我,我还是初学者

现在试试这个

 -(IBAction)button:(id)sender{

    for (int z=0; z < 9; z++){

    //do stuff

    float progressBarPercentage = (1.0 / 9.0 * (z + 1));
            [self performSelectorOnMainThread:@selector(makeMyProgressBarMove) withObject:nil waitUntilDone:YES];

    }

    }

    -(void)makeMyProgressBarMove{

        [progressBar setProgress:progressBarPercentage animated:YES];
         }
-(iAction)按钮:(id)发送者{
对于(intz=0;z<9;z++){
//做事
浮动百分比=(1.0/9.0*(z+1));
[self-performSelectorOnMainThread:@selector(makeMyProgressBarMove),对象:nil waitUntilDone:YES];
}
}
-(void)makeMyProgressBarMove{
[进度条设置进度:进度条百分比:是];
}
您还需要在另一个线程上“执行任务”,否则它仍然会阻塞您的主线程。请注意,
performSelectorOnMainThread
如果已经在主线程上,则没有任何用处

使用libdispatch是因为它更容易:

-(IBAction)button:(id)sender{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        for (int z=0; z < 9; z++)
        {
            //do stuff

            float progressBarPercentage = (1.0 / 9.0 * (z + 1));

            dispatch_async(dispatch_get_main_queue(), ^{
                [progressBar setProgress:progressBarPercentage animated:YES];
            });
        }
    });
}
-(iAction)按钮:(id)发送者{
调度异步(调度获取全局队列(调度队列优先级默认为0)^{
对于(intz=0;z<9;z++)
{
//做事
浮动百分比=(1.0/9.0*(z+1));
dispatch\u async(dispatch\u get\u main\u queue()^{
[进度条设置进度:进度条百分比:是];
});
}
});
}

我刚刚检查了调试器,调试器正在移动到
makeMyProgreeBarMove:
方法,但是它仍然没有更新ProgressBar。您还需要在另一个线程上“执行任务”,否则它仍然会阻塞主线程。请注意,
performselectornmainthread
如果您已经在主线程上,则没有任何用处。我在ViewController.m上,这是主线程吗?progressBarPercentage是在iAction内部还是外部声明的?我忘了添加它,我将进行编辑,但它在我的.h文件中声明为主线程上的floatBeing或not与您所在的文件或方法运行的对象无关,而是与方法的调用方式有关。这里,您的方法在主线程上运行,因为它是从UI的按钮调用的(所有与UI相关的操作都是在主线程上完成的)。是的,抱歉。这应该是固定的!好吧,这样就行了。。。你能解释一下原因吗?什么是
dispatch\u async(dispatch\u get\u global\u queue(dispatch\u queue\u PRIORITY\u DEFAULT,0)
stuff?队列是线程的抽象,使它们更易于使用IMO。可以将它们视为能够以FIFO顺序执行任意代码块的东西。dispatch\u async是一个函数,它将向队列提交一个块以供执行,并立即返回。因此,
按钮:
方法返回,而不会阻止您的任务主线程。同时,将块发送到(第一个)dispatch_async开始执行,并定期使用另一个dispatch_async回调主线程以更新进度条。如果您想更深入地了解为什么阻塞主线程是一个问题,以及dispatch队列如何解决此问题,您应该阅读有关运行循环的内容(一个非常重要的概念),线程和调度队列。我相信有很多文章会比我更清楚地解释它:)非常感谢!我会读更多。我不在任何计算机相关领域,所以所有的概念对我来说都是非常新的!再次谢谢你,塔姆!:D
 -(IBAction)button:(id)sender{

    for (int z=0; z < 9; z++){

    //do stuff

    float progressBarPercentage = (1.0 / 9.0 * (z + 1));
            [self performSelectorOnMainThread:@selector(makeMyProgressBarMove) withObject:nil waitUntilDone:YES];

    }

    }

    -(void)makeMyProgressBarMove{

        [progressBar setProgress:progressBarPercentage animated:YES];
         }
-(IBAction)button:(id)sender{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        for (int z=0; z < 9; z++)
        {
            //do stuff

            float progressBarPercentage = (1.0 / 9.0 * (z + 1));

            dispatch_async(dispatch_get_main_queue(), ^{
                [progressBar setProgress:progressBarPercentage animated:YES];
            });
        }
    });
}