解决xzingobjc库扫描二维码,回调函数调用多次

今天把项目中用到的xzing库替换为了xzingobjc库,发现回调函数- (void)captureResult:(ZXCapture*)capture result:(ZXResult*)result;总是会被调用两次。baidu/google搜索了下没有找到有用的信息。看来只能分析代码了。

分析代码发现

- (void)captureOutput:(AVCaptureOutput*)captureOutput

didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer

       fromConnection:(AVCaptureConnection*)connection函数中

if (self.delegate) {

        ZXBinaryBitmap*bitmap = [[ZXBinaryBitmapalloc]initWithBinarizer:binarizer];

        NSError*error;

        ZXResult*result = [self.readerdecode:bitmaphints:self.hintserror:&error];

        if(result) {

          dispatch_async(dispatch_get_main_queue(), ^{

            [self.delegatecaptureResult:selfresult:result];

          });

        }

      }

这段代码比较可疑。在一个线程执行的时间片段内,识别二维码的线程可以识别成功多次,从而将回调函数多次添加到主线程队列中。

我希望识别成功之后,立马就停止识别,待到需要识别的时候,再开启识别。因此只需要在识别成功后,将任务添加到主线程队列之前,调用 [self stop]即可。

具体代码如下:

if (self.delegate) {

        ZXBinaryBitmap*bitmap = [[ZXBinaryBitmapalloc]initWithBinarizer:binarizer];

        NSError*error;

        ZXResult*result = [self.readerdecode:bitmaphints:self.hintserror:&error];

        if(result) {

            [selfstop];//关键代码,就是这一句

          dispatch_async(dispatch_get_main_queue(), ^{

            [self.delegatecaptureResult:selfresult:result];

          });

        }

      }

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容