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 タイマー ソースを使用できます (または、さらに悪いことに、独自のタイマーを作成NSThreadしてそのスレッドで実行ループを開始し、そのスレッドの実行ループでスケジュールを設定しNSTimerます)。 GCD コードを削除し、メインの実行ループからタイマーを開始するのが簡単になります (つまり、タイマーの作成をバックグラウンド キューにディスパッチしないでください)。

同様に、CLLocationManager位置情報の更新もメイン スレッドから構成して開始する必要があります。あなたのようにそれをしても問題はないと思いますが、不要です。

タイマーとロケーションの更新は非同期で行われます。適切なハンドラーがかなり速く実行される限り、バックグラウンド キューでそれらをスケジュールしようとしても心配する必要はありません。メインスレッドは一般的に問題ありません。

于 2014-08-18T12:34:43.780 に答える