【发布时间】:2020-02-18 23:09:32
【问题描述】:
我有一个带有ViewController.swift 和Broadcast Upload app Extension 的示例应用程序。在我的项目中,我创建了两个框架:
-
MySDK,是一个快速的框架,用于分析和处理CMSampleBuffer,以避免广播应用扩展消耗过多的内存。这个SDK有一个单例,一个变量isReady,函数func initialize和func analyzeSampleBuffer(_ sampleBuffer: CMSampleBuffer) -
Broadcaster,是一个 swift 框架,用于调用MySDK调用分析和处理CMSampleBuffer(是的,听起来像是与 MySDK 的副本,但我不能这样做,我需要这两个框架)。此 SDK 具有单例和以下功能:func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?)、func processSampleBuffer(_ sampleBuffer: CMSampleBuffer)
在这个项目中,我添加了一个名为 BroadcastExtension 的 Broadcast Upload App Extension。
在他的主文件SampleHandler.swift 中,在processSampleBuffer 函数中,我使用我的Broadcaster SDK 将应用程序扩展的责任交给Broadcaster SDK,然后再到MySDK 流式传输CMSampleBuffer 我从应用程序扩展收到的Broadcaster.shared.processSampleBuffer(sampleBuffer) .最后MySDK成功解析处理CMSampleBuffer但是我的广播上传应用扩展占用了太多内存,并且在屏幕共享后X分钟后崩溃(应用扩展最大50Mb)。如何在应用扩展上使用更少的内存?
这是我的文件:
MySDK.swift:
import Foundation
import ReplayKit
@objcMembers public class MySDK {
public static let shared = MySDK()
public var isReady = false
public func initialize() {
// Init SDK
}
public func analyzeSampleBuffer(_ sampleBuffer: CMSampleBuffer) {
// Analyze
}
}
Broadcaster.swift :
import Foundation
import ReplayKit
import MySDK
@objcMembers public class Broadcaster: NSObject, Codable {
public static let shared = Broadcaster()
public func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?) {
MySDK.shared.isReady = true
}
public func processSampleBuffer(_ sampleBuffer: CMSampleBuffer) {
if MySDK.shared.isReady {
MySDK.shared.analyzeSampleBuffer(sampleBuffer)
}
}
}
SampleHandler.swift :
import ReplayKit
import Broadcaster
class SampleHandler: RPBroadcastSampleHandler {
override func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?) {
// User has requested to start the broadcast. Setup info from the UI extension can be supplied but optional.
Broadcaster.shared.broadcastStarted(withSetupInfo: setupInfo)
}
override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) {
switch sampleBufferType {
case RPSampleBufferType.video:
// Handle video sample buffer
Broadcaster.shared.processSampleBuffer(sampleBuffer)
break
case RPSampleBufferType.audioApp:
break
case RPSampleBufferType.audioMic:
break
@unknown default:
fatalError("Unknown type of sample buffer")
}
}
}
我想在应用程序中使用相同的共享实例,但在应用程序扩展中。我尝试将组应用程序放在应用程序和应用程序扩展之间,并使用Userdefaults和对应于组ID的suiteName来发送共享实例,但是当我在应用程序扩展中接收时,地址内存不一样,创建对象的另一个实例(我想要应用程序和应用程序扩展之间的真正单例)。我不知道如何在应用扩展上节省内存,以及如何在 2 个框架、应用扩展和应用之间进行通信以在项目的每个部分使用相同的单例。
【问题讨论】:
-
你有没有设法解决这个问题?
-
@ChrisTomAlx 我们不能使用同一个单例。应用扩展和主应用是分开的。我们唯一能做的就是通过应用组共享数据进行通信。 :)
-
感谢您澄清这一点。非常感谢:)
标签: ios swift frameworks ios-app-extension replaykit