0

こんにちは、私がやろうとしていることは次のとおりです。

  • AVFoundation を使用して画像を撮影する写真処理アプリを持っています
  • 私は60Hzでデバイスの位置を処理しているDeviceMotionキューを持っています
  • 画像を撮影したら、トリミングして保存する必要があります。DeviceMotion は実行し続け、遅延なくインターフェイスを更新する必要があります

私が見ているのは、DeviceMotion キューからのインターフェイスへの更新が、画像のトリミング中に凍結されていることです。

これは、DeviceMotion の更新を開始する方法です。

self.motionManager.deviceMotionUpdateInterval = 1.0f/60.0f;
gyroQueue = [[NSOperationQueue alloc] init];

[self.motionManager startDeviceMotionUpdatesToQueue:gyroQueue withHandler:^(CMDeviceMotion *motion, NSError *error){
        [NSThread setThreadPriority:1.0];
        [self processMotion:motion withError:error];
    }];

画像が AVFoundation から返されると、処理のためにキューに追加されます。

imageProcessingQueue = [[NSOperationQueue alloc] init];
    [imageProcessingQueue setName:@"ImageProcessingQueue"];
    [imageProcessingQueue setMaxConcurrentOperationCount:1];

//[imageProcessingQueue addOperationWithBlock:^{
    //[self processImage:[UIImage imageWithData:imageData]];
//}];

    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(processImage:) object:[UIImage imageWithData:imageData]];
    [operation setThreadPriority:0.0];
    [operation setQueuePriority:NSOperationQueuePriorityVeryLow];
    [imageProcessingQueue addOperation:operation];

および画像を処理する方法:

- (void)processImage:(UIImage*)image {

    CGSize cropImageSize = CGSizeMake(640,960);

    UIImage *croppedImage  = [image resizedImageWithContentMode:UIViewContentModeScaleAspectFit bounds:cropImageSize interpolationQuality:kImageCropInterpolationQuality];

    NSData *compressedImageData = UIImageJPEGRepresentation(croppedImage, kJpegCompression);

    [self.doc addPhoto:compressedImageData];
}

問題は次のとおりです。

  • NSOperationQueue を使用して画像が処理されている場合、画像のトリミング中は devicemotion の更新がブロックされます。

performSelectorInBackground を使用して画像を処理すると、希望どおりに動作します (DeviceMotion キューに遅延はありません)

[self performSelectorInBackground:@selector(processImage:) withObject:[UIImage imageWithData:imageData]];

バックグラウンド スレッドに関する私の理解を更新する必要がある場所についてのアイデアはありますか? :)

PS。以前にも質問したのですが、解決しなかったので再投稿です

4

1 に答える 1