1

我目前正在尝试在一段时间内在后台运行一个进程,以确保用户在我收集数据时仍然可以导航应用程序。我发现我应该为此使用 GCD。但是,我不确定如何arrayBuild在后台队列中运行。

我如何也将它添加到后台队列?删除对 dispatch_async 的引用后,应用程序工作正常,所以我知道问题出在线程上。

- (IBAction)buttonPressed:(id)sender {

    dispatch_async(backgroundQueue, ^{

        manager.delegate = self;
        manager.desiredAccuracy = kCLLocationAccuracyBest;

        /* Removed for testing
        [manager startUpdatingLocation];
         */

        // TEST

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

        // Initialise Array
        resultsArray = [[NSMutableArray alloc]init];

        // END TEST

    });

}

- (void)arrayBuild {

    loopCount++;

    if (loopCount >= 11) {

        // Invalidate Timer
        [myTimer invalidate];
        myTimer = nil;

        // Find Average
        NSNumber *avg = [resultsArray valueForKeyPath:@"@avg.self"];

        // Change Text of Label to Average & Log
        self.signal.text = [NSString stringWithFormat:@"%@",avg];
        NSLog(@"%@",avg);



    }else{

        // Declare Signal Strength
        float signalstrength = CTGetSignalStrength();

        // Individual Result & Convert to Integer
        NSString *result = [NSString stringWithFormat:@"%f", signalstrength];
        NSInteger resultInt = [result integerValue];

        // Add Object
        [resultsArray addObject:[NSNumber numberWithFloat:resultInt]];

        // Change Text of Label Each Second
        self.signal.text = [NSString stringWithFormat:@"%d",loopCount];
        NSLog(@"%f",signalstrength);

    }

}
4

1 回答 1

1

您不能像这样在后台队列中创建计时器。NSTimer需要一个运行循环,而后台队列通常没有。如果您希望计时器在自定义后台队列上触发(或者更糟糕的是,创建您自己的并在该线程上启动一个运行循环,然后在该线程的运行循环上安排),您可以使用GCD 计时器源,但它只是去更容易消除 GCD 代码,只需从主运行循环启动计时器(即不要将计时器的创建分派到后台队列)。NSThreadNSTimer

CLLocationManager同样,您也应该从主线程配置和启动位置更新。我认为这样做不会造成问题,但这是不必要的。

计时器和位置更新是异步发生的,只要适当的处理程序运行得相当快,就不必担心尝试将它们安排在后台队列中。主线程一般没问题。

于 2014-08-18T12:34:43.780 回答