OBJ。 C – QR阅读应用程序运行速度太慢

我在这个网站上通过教程(Appcoda的教程),用AVFoundation制作了一个QR码阅读应用程序。 阅读QR码后,该应用程序显示一个UIAlertView。 但是花了近2分钟(有时超过3分钟)。 我将在这里粘贴整个ViewController.m文件。 我希望这已经足够了。 (UIAlertView在captureOutput方法中)

// // ViewController.m // Yuvio // // Created by İhsan Batuğhan YILMAZ on 29/08/15. // Copyright © 2015 Farabius. All rights reserved. // #import "ViewController.h" #import <AVFoundation/AVFoundation.h> @interface ViewController () @property (nonatomic) BOOL isReading; @property (nonatomic, strong) AVCaptureSession *captureSession; @property (nonatomic, strong) AVCaptureVideoPreviewLayer *videoPreviewLayer; -(BOOL)startReading; -(void) stopReading; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. _isReading=NO; _captureSession = nil; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } -(IBAction)startStopReading:(id)sender { if (!_isReading) { if ([self startReading]) { [_btnStart setTitle:@"Stop"]; } } else{ [self stopReading]; [_btnStart setTitle:@"Start!"]; } _isReading = !_isReading; } - (BOOL)startReading { NSError *error; AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error]; if (!input) { NSLog(@"%@", [error localizedDescription]); return NO; } _captureSession = [[AVCaptureSession alloc] init]; [_captureSession addInput:input]; AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init]; [_captureSession addOutput:captureMetadataOutput]; dispatch_queue_t dispatchQueue; dispatchQueue = dispatch_queue_create("myQueue", NULL); [captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatchQueue]; [captureMetadataOutput setMetadataObjectTypes:[NSArray arrayWithObject:AVMetadataObjectTypeQRCode]]; _videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession]; [_videoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; [_videoPreviewLayer setFrame:_cameraView.layer.bounds]; [_cameraView.layer addSublayer:_videoPreviewLayer]; [_captureSession startRunning]; return YES; } -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{ if (metadataObjects != nil && [metadataObjects count] > 0) { AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0]; if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"QR Detected" message:[metadataObj stringValue] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [alert show]; [self performSelectorOnMainThread:@selector(stopReading) withObject:nil waitUntilDone:NO]; [_btnStart performSelectorOnMainThread:@selector(setTitle:) withObject:@"Start!" waitUntilDone:NO]; _isReading = NO; } } } -(void)stopReading{ [_captureSession stopRunning]; _captureSession = nil; [_videoPreviewLayer removeFromSuperlayer]; return; } @end 

我认为这个问题是在主线程之外使用UI函数。 试试这个代码:

 -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{ if (metadataObjects != nil && [metadataObjects count] > 0) { AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0]; if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) { __weak ViewController *weakSelf = self; dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf processQRCode:metadataObj]; }); } } } -(void)processQRCode:(AVMetadataMachineReadableCodeObject *)codeObject{ UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"QR Detected" message:[codeObject stringValue] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [alert show]; [self stopReading]; [_btnStart setTitle:@"Start!" forState:UIControlStateNormal]; _isReading = NO; } 

我检查了您的视图控制器与此修复程序,它的工作很快。