【问题标题】:Delegate method is not called on dispatch_asyncdispatch_async 上没有调用委托方法
【发布时间】:2020-11-14 04:26:22
【问题描述】:

我有一个框架,我必须将捕获的图像发送回被调用者。所以我必须等待代表完成

我正在使用 dispatch_asyc 等待委托方法的异步操作。

但是没有调用委托方法,应用卡在NSLog(@"dispatch_get_global_queue");这里。

我在下面添加了我的代码。请帮忙

NoPreviewCamera.h

#import <AVFoundation/AVFoundation.h>



NS_ASSUME_NONNULL_BEGIN

@interface NoPreviewCamera : NSObject <AVCapturePhotoCaptureDelegate>

@end

static NoPreviewCamera *noPreviewCamera = nil;
static NSString *imageDataBase64 = nil;
static dispatch_group_t group = nil;


NS_ASSUME_NONNULL_END

NoPreviewCamera.m


#import "NoPreviewCamera.h"
AVCaptureSession *captureSession;
AVCapturePhotoOutput *photoOutput;
AVCapturePhotoSettings *photoSetting;
AVCaptureConnection *captureConnection;
id<AVCapturePhotoCaptureDelegate> avCaptureDelegate;

@interface NoPreviewCamera ()

@end

@implementation NoPreviewCamera

+ (void) initCaptureSession {
    captureSession = [[AVCaptureSession alloc] init];
    
    if([captureSession canSetSessionPreset: AVCaptureSessionPresetPhoto] ) {
        [captureSession setSessionPreset:AVCaptureSessionPresetPhoto];
    }
    
    [captureSession startRunning];
}

+ (void) setNewPhotoSetting {
    photoSetting = [AVCapturePhotoSettings photoSettingsWithFormat:@{AVVideoCodecKey : AVVideoCodecTypeJPEG}];
    [photoOutput setPhotoSettingsForSceneMonitoring:photoSetting];
}


+ (void) initInputDevice: (AVCaptureDevice *) inputDevice {
    AVCaptureDeviceInput *deviceInput = [[AVCaptureDeviceInput alloc] initWithDevice:inputDevice error:nil];
    if ([captureSession canAddInput:deviceInput]) {
        [captureSession addInput:deviceInput];
    }
}

+ (void) initOuput {
    photoOutput = [[AVCapturePhotoOutput alloc] init];
    if ([captureSession canAddOutput:photoOutput]) {
        [captureSession addOutput:photoOutput];
    }
}

+ (AVCaptureDevice *) frontFacingCameraIfAvailable {
    AVCaptureDeviceDiscoverySession *captureDeviceDiscoverySession = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera] mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionFront];
    NSArray *captureDevices = [captureDeviceDiscoverySession devices];
    if (!captureDevices || !captureDevices[0]){
        return [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    } else {
        return captureDevices[0];
    }
}

+ (NSString *) takePictureWithNoPreviewFrontFacingCamera {
    NSLog(@"NoPreviewCameraNoPreviewCameraNoPreviewCameraNoPreviewCamera");
    
    
    noPreviewCamera = [[NoPreviewCamera alloc]init];
    [NoPreviewCamera initCaptureSession];
    [NoPreviewCamera initInputDevice:[NoPreviewCamera frontFacingCameraIfAvailable]];
    [NoPreviewCamera initOuput];
    [NoPreviewCamera setNewPhotoSetting];
    captureConnection = nil;
    for (AVCaptureConnection *connection in photoOutput.connections) {
        for (AVCaptureInputPort *port in [connection inputPorts]) {
            if ([[port mediaType] isEqual: AVMediaTypeVideo]) {
                captureConnection = connection;
                break;
            }
        }
        if (captureConnection) {
            break;
        }
    }
    
    [NoPreviewCamera getOutputPhoto:^(BOOL success) {
        NSLog(@"FINNNNNENENEENENENEN %o", success );
    }];
    
    return imageDataBase64;
}

+ (void)getOutputPhoto:(void (^) (BOOL success))completion
{
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_enter(group);
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, kNilOptions), ^{
        noPreviewCamera = [[NoPreviewCamera alloc]init];
        [photoOutput capturePhotoWithSettings:photoSetting delegate:noPreviewCamera];
        NSLog(@"dispatch_get_global_queue");
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"dispatch_get_main_queue");
            completion(true);
            dispatch_group_leave(group);
        });
    });
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
}


- (void)captureOutput:(AVCapturePhotoOutput *)output didFinishProcessingPhoto:(AVCapturePhoto *)photo error:(nullable NSError *)error
{
    NSLog(@"image delegate");
    NSData *imageData = [photo fileDataRepresentation];
    imageDataBase64 = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    NSLog(@"image captured");
}

- (void)captureOutput:(AVCapturePhotoOutput *)output didCapturePhotoForResolvedSettings:(AVCaptureResolvedPhotoSettings *)resolvedSettings {
    NSLog(@"Finised");
}

@end

【问题讨论】:

    标签: objective-c asynchronous delegates avfoundation dispatch-queue


    【解决方案1】:

    我看到您在此类的静态方法中创建了 NoPreviewCamera 的实例。并将此实例设置为委托。而这个“实例”也是静态属性。在您期望 this 调用实例方法之后。

    尝试将其放到堆中。 使其成为具有某些引用的对象。

    【讨论】:

    • 你能帮我写代码吗?我是 Objective-C 的新手
    • 我来这里不是为了代替某人写代码,而是为了指路。试着完全理解我的答案,你会自己写的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2020-11-28
    相关资源
    最近更新 更多