我有一个带有ViewController.swift
和Broadcast Upload app Extension
的示例应用程序。在我的项目中,我创建了两个框架:
MySDK
,是一种用于分析和处理CMSampleBuffer
的快速框架,以避免广播应用程序扩展占用过多的内存。该SDK具有单例,变量isReady
,函数func initialize
和func analyzeSampleBuffer(_ sampleBuffer: CMSampleBuffer)
Broadcaster
,是一个用于调用MySDK
进行分析和处理CMSampleBuffer
的快速框架(是的,听起来像MySDK的副本,但是我不能这样做,我需要这两个框架)。此SDK具有单例和以下功能:func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?)
,func processSampleBuffer(_ sampleBuffer: CMSampleBuffer)
在此项目中,我添加了一个名为Broadcast Upload App Extension
的BroadcastExtension
。在他的主文件SampleHandler.swift
中,在processSampleBuffer
函数中,我使用Broadcaster SDK
负责从应用扩展名到Broadcaster SDK
的责任,然后再向MySDK
负责从应用程序扩展名中收到的CMSampleBuffer
的传输:Broadcaster.shared.processSampleBuffer(sampleBuffer)
。最后,MySDK
成功分析并处理了CMSampleBuffer
,但我的广播上传应用程序扩展占用了太多内存,并且在屏幕共享X分钟后崩溃(应用程序扩展最大50Mb)。如何在App Extension上使用更少的内存?
这是我的文件:
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
来发送共享实例,但是当我在应用扩展中收到消息时,地址内存不一样,创建对象的另一个实例(我想要在应用程序和应用程序扩展之间真正的单例)。我不知道如何在应用程序扩展上节省内存,以及如何在两个框架,应用程序扩展和应用程序之间进行通信,以在项目的每个部分上使用相同的单例。
但是我的广播上传应用程序扩展程序占用了太多内存,并且崩溃了屏幕共享X分钟后(应用扩展程序最多50Mb)。如何在App Extension上使用更少的内存?