-1

我希望每次函数循环通过循环时都能够执行延迟。我已经有一个循环设置,如下所示:

for (float batteryPercentage = 1; batteryPercentage <= 0; batteryPercentage -= 0.01)
    {
        double timeUntilNextDegreeDrop = 9.0;
        dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeUntilNextDegreeDrop * NSEC_PER_SEC));
        dispatch_after (time, dispatch_get_main_queue(), ^(void)
        {
            [batteryLevel setProgress:batteryPercentage animated:YES];

            float batteryLevelPercentage = batteryPercentage * 100;
            batteryLevelLabel.text = [NSString stringWithFormat:@"Battery Level: %f%%", batteryLevelPercentage];
        });
    }

batteryPercentage是我试图从 1 到 0 每 9 秒递减 0.01 直到值达到 0 的变量。程序的总长度应该是 900 秒(15 分钟)。每 9 秒,我希望此代码每 9 秒执行一次并更改被UIProgressView调用的值batteryLevel。然后,我想乘以batteryPercentage100,得到一个整数百分比,比如乘以 0.67 得到 67,然后将batteryLevelLabel文本替换为新值。当我尝试执行此操作时,batteryLevel进度视图根本不会填充,文本也不会改变。我假设计时器有问题,那么输入 9 秒延迟的更有效方法是什么?

4

3 回答 3

0

按照建议尝试使用 nstimer

[NSTimer scheduledTimerWithTimeInterval:9.0
target:self
selector:@selector(targetMethod:)
userInfo:nil
repeats:YES];

//targetMethod 将每 9 秒调用一次 // [myTimer invalidate]; myTimer = nil;当你的任务完成时调用

于 2014-02-15T18:17:34.907 回答
0

这是一种使用 NSThread 与现有结构保持接近的方法:

@interface MyThread : NSThread
@end

@implementation MyThread

-(void)main
{
    NSDate * when = [ NSDate date ] ;

    for ( int battery = 1000; battery >= 0; battery -= 1 )
    {
        when = [ NSDate dateWithTimeInterval:1.0 sinceDate:when ] ;
        [ NSThread sleepUntilDate:when ] ;

        [ [ NSThread mainThread ] perform:^{
            [batteryLevel setProgress:(CGFloat)battery / 10.0 animated:YES];
            batteryLevelLabel.text = [NSString stringWithFormat:@"Battery Level: %f%%", (CGFloat)battery / 10.0 ];
        }];
    }
}

@end

帮手类别

@implementation NSThread (Perform)

-(void)_perform:(void(^)())block
{
    block() ;
}

-(void)perform:(void(^)())block
{
    BOOL wait = [ NSThread currentThread ] == self ;
    [ self performSelector:@selector( _perform: ) onThread:self withObject:[ block copy ] waitUntilDone:wait ] ;
}

@end

然后开始你的计时器NSThread * thread = [ [ MyThread alloc ] init ] ; [ thread start ] ;

可能更容易重新设计您的应用程序以使用标准 NSTimer + 回调结构......

(我也做了一个使用 GCD 来查看它的样子:

dispatch_queue_t q = dispatch_queue_create( NULL, NULL ) ;
dispatch_async( q, ^{
    NSDate * when = [ NSDate date ] ;

    for ( int battery = 1000; battery >= 0; battery -= 1 )
    {
        dispatch_sync( dispatch_get_main_queue(), ^{
            [batteryLevel setProgress:(CGFloat)battery / 10.0 animated:YES];
            batteryLevelLabel.text = [NSString stringWithFormat:@"Battery Level: %f%%", (CGFloat)battery / 10.0 ];
        }) ;

        when = [ NSDate dateWithTimeInterval:1.0 sinceDate:when ] ;
        [ NSThread sleepUntilDate:when ] ;
    }
}) ;

(但我认为不能保证不同的队列在不同的线程上)

于 2014-02-15T20:09:31.823 回答
-1

你可以用+ (void)sleepUntilDate:(NSDate *)aDate

于 2014-02-15T18:12:33.400 回答