用的NSTimer更换usleep?(Replace usleep with NSTimer?)

2019-10-22 21:53发布

我怎么能代替usleepNSTimer下面的代码:

/**
 * DETERMINATE BAR with LABEL
 */

- (void)showDeterminateBarWithLabel:(CDVInvokedUrlCommand *)command {

    // obtain commands
    bool dim = [[command.arguments objectAtIndex:0] boolValue];
    int increment = [[command.arguments objectAtIndex:1] intValue];
    NSNumber* incrementValue = @(increment);
    NSString* text = [command.arguments objectAtIndex:2];

    // initialize indicator with options, text, detail
    self.progressIndicator = nil;
    self.progressIndicator = [MBProgressHUD showHUDAddedTo:self.webView.superview animated:YES];
    self.progressIndicator.mode = MBProgressHUDModeDeterminateHorizontalBar;
    self.progressIndicator.labelText = text;


    // Check for dim : true ? false
    if (dim == true) {
        self.progressIndicator.dimBackground = YES;
    }

    // Load Progress bar with ::incrementValue
    [self.progressIndicator showWhileExecuting:@selector(progressTask:) onTarget:self withObject:incrementValue animated:YES];

    CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:@""];
    [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}

- (void)progressTask:(NSNumber *)increment{

    // get increment value
    int _increment = [increment intValue];

    float progress = 0.0f;
    while (progress < 1.0f) {
        progress += 0.01f;
        self.progressIndicator.progress = progress;

        // increment in microseconds (100000mms = 1s)
        usleep(_increment);
    }
}

此代码是取自这里 。

Answer 1:

你不能。 这两个是完全不同的,这代码需要阻塞操作。 编辑:由于它是在后台线程上执行。

该方法-progressTask:从执行这种方法 ,这是一个开始新的线程 :

- (void)launchExecution {
    @autoreleasepool {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
        // Start executing the requested task
        [targetForExecution performSelector:methodForExecution withObject:objectForExecution];
#pragma clang diagnostic pop
        // Task completed, update view in main thread (note: view operations should
        // be done only in the main thread)
        [self performSelectorOnMainThread:@selector(cleanUp) withObject:nil waitUntilDone:NO];
    }
}

它依赖于同步执行和使用NSTimer将requre开始NSRunLoop并让它运行了一段时间,这将是实际可行的,但就是不

提示:如果你喜欢Objective-C的方法,请拨打+[NSThread sleepForTimeInterval:]有论点秒。



Answer 2:

总之,你不能用它来阻塞线程。 与任何类型的睡眠或延迟的阻塞线程是糟糕的设计,应该避免的异常罕见病例之外。

在使用iOS / OS X应用程序阻止主线程是严格禁止。 主要runloop必须被允许运行或您的应用程序将是,充其量,反应迟钝,在最坏的情况,只是将无法正常工作。

相反,使用一个NSTimer到周期性回调到你的代码更新值。 它不会阻止执行。



文章来源: Replace usleep with NSTimer?