【问题标题】:Creating a label that counts up over time, iOS创建一个随时间递增的标签,iOS
【发布时间】:2015-05-18 05:21:38
【问题描述】:

我正在尝试创建一个标签(或任何 UI 元素),它从一个数字开始并向上计数,同时不会减慢所有其他进程。

我不完全确定如何使用多线程/GCD/NSTimer 来使其与 iOS 一起工作是最好的。有什么建议?这是我目前拥有的代码:

    -(void)countup:(UIBarButtonItem *)label from:(int)startNumber to:(int)endNumber{
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //         double timeInterval = 5; //5 seconds from start to stop
    //         int diff = endNumber - startNumber;
    //         double t = timeInterval/diff;
             [NSThread sleepForTimeInterval: 0.01];

             if(diff==0){
                 return;
             }
             if(diff>0){
                 label.title= [NSString stringWithFormat:@"%d", startNumber + 1];
                 [self countup:label from:startNumber+1 to:endNumber];
             }
             if(diff<0){
                 label.title = [NSString stringWithFormat:@"%d", startNumber - 1];
                 [self countup:label from:startNumber-1 to:endNumber];
             }
        });
    }

不幸的是,这只是将我从我拥有的第一个号码带入,等待一段时间,然后将我带到我拥有的最后一个号码。

I've also tried the following with little luck: 

-(void)countup:(UIBarButtonItem *)label from:(int)startNumber to:(int)endNumber{
//         double timeInterval = 5; //5 seconds from start to stop
         int diff = endNumber - startNumber;
//         double t = timeInterval/diff;

         if(diff==0){
             return;
         }
         if(diff>0){
             label.title= [NSString stringWithFormat:@"%d", startNumber + 1];
             [self countup:label from:startNumber+1 to:endNumber];
             [NSTimer scheduledTimerWithTimeInterval:0.1
                                            target:self
                                            selector:@selector(callCountUp:)
                                            userInfo:[NSDictionary dictionaryWithObjectsAndKeys:label,
                                                      @"value1", startNumber, @"value2", endNumber, @"value3",nil]
                                            repeats:YES];
         }
         if(diff<0){
             label.title = [NSString stringWithFormat:@"%d", startNumber - 1];
             [self countup:label from:startNumber-1 to:endNumber];
         }
}

- (void)callCountUp:(NSTimer *)theTimer {
    UIBarButtonItem *value1 = [[theTimer userInfo] objectForKey:@"value1"];
    int value2 = (int)[[theTimer userInfo] objectForKey:@"value2"];
    int value3 = (int)[[theTimer userInfo] objectForKey:@"value3"];
    [self countup: value1 from:value2 to:value3];
}

【问题讨论】:

    标签: ios multithreading count grand-central-dispatch nstimer


    【解决方案1】:

    您必须在主线程中更新显示在屏幕上的 UI 元素,因此您更改标签文本的每一行都必须包含在其中

    dispatch_async(dispatch_get_main_queue){
        // change labels text
    }
    

    还有更好的方法来做你想做的事,你应该看看 NSTimer,例如你可以这样做

    timer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                     target:self
                                   selector:@selector(updateTime)
                                   userInfo:nil
                                    repeats:YES];
    

    这将每秒调用一次 updateTime 函数,直到你停止它

    【讨论】:

    • 我在将多个参数(基本上是一个递归函数)传递给 NSTimer 时遇到问题,我该怎么做?
    • @John 您可以查看如何在选择器中传递多个参数或尝试第一种方法
    • 第一种方法 = 没有足够的论据?你能给我一个代码示例吗?
    • 我尝试了以下但有一个错误:if(diff>0){ dispatch_async(dispatch_get_global_queue){ label.title= [NSString stringWithFormat:@"%d", startNumber + 1]; } [self countup:label from:startNumber+1 to:endNumber]; }
    • @John 我的错,我把“global”替换为“main”,检查一下试试,我的错
    【解决方案2】:

    以下代码最终为我工作:

    -(void)countup:(UIBarButtonItem *)label from:(int)startNumber to:(int)endNumber{
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            double diff = endNumber - startNumber;
            double t = 5;
            t = t/((diff*diff)+5);
            if(t<0){
                t=t*-1;
            }
            [NSThread sleepForTimeInterval: t];
    
            if(diff==0){
                return;
            }
            if(diff>0){
                dispatch_async(dispatch_get_main_queue(), ^{
                    [UIView setAnimationsEnabled:NO];
                    label.title= [NSString stringWithFormat:@"%d", startNumber + 1];
                    [UIView setAnimationsEnabled:YES];
                });
                [self countup:label from:startNumber+1 to:endNumber];
            }
            if(diff<0){
                dispatch_async(dispatch_get_main_queue(), ^{
                    label.title= [NSString stringWithFormat:@"%d", startNumber - 1];
                });
                [self countup:label from:startNumber-1 to:endNumber];
            }
        });
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多