今天把项目中用到的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];
});
}
}