1

我有以下课程:

class Scanner: NSObject, AVCaptureVideoDataOutputSampleBufferDelegate {}

它在类中实现了一个委托方法AVCaptureVideoDataOutputSampleBufferDelegate

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection)
    {}

即使我将函数设置为privatefileprivateinternal,它仍然出现在 Xcode 的代码完成中:

在此处输入图像描述

有没有办法从课外使用隐藏这个调用?

4

2 回答 2

1

您的问题与Single Responsibility Principle有点相关。基本上,您的班级会尝试做比需要更多的任务 - 对AVFoundation事件做出反应,在这种情况下是captureOutput方法。

建议将您的班级一分为二,让一个班级处理所有AVFoundation设置/委托,并且Scanner只处理原始数据。这边走:

  • 您将关注点分开,这也允许您Scanner在其他上下文中重用
  • 您甚至可以AVFoundation从扫描仪中删除依赖关系,使其更加独立
  • 您不会获得不需要的功能,因为是的,扫描仪不需要公开AVFoundation委托方法。

此外,很可能您的扫描仪不需要 aAVCaptureConnection来完成其工作,但不幸的是,由于委托,这种依赖关系被泄露到了类中。分担责任也有助于解决这个问题。

于 2021-03-21T07:33:20.113 回答
1

一种方法是创建一个符合协议的私有内部类,并让内部类持有对外部类的弱引用,以防您需要在委托方法的实现中使用外部类的成员。

class Scanner {
    ...

    private class VideoOutputDelegate: NSObject, AVCaptureVideoDataOutputSampleBufferDelegate {
        weak var scanner: Scanner?
        init(scanner: Scanner) { self.scanner = scanner }

        func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
            ...
        }
    }

    private let videoOutputDelegate = VideoOutputDelegate(scanner: self)
}

您可以将其设置sampleBufferDelegate为,而不是将其设置为。selfvideoOutputDelegate

(我认为),AVCaptureVideoDataOutput持有对它的弱引用sampleBufferDelegate,所以videoOutputDelegate这里是唯一保持对象存活的强引用。

于 2021-03-21T07:08:06.680 回答