У меня есть пример приложения с ViewController.swift
и Broadcast Upload app Extension
. Внутри моего проекта у меня есть две созданные мной фреймворки:
MySDK
- это быстрая фреймворк, используемая для анализа и обработки CMSampleBuffer
, чтобы избежать того, что Broadcast App Extension потребляет слишком много Память. Этот 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
, но мое расширение приложения широковещательной загрузки занимает слишком много памяти и занимает sh через X минут после совместного использования экрана (не более 50 МБ для расширения приложения). Как я могу использовать меньше памяти для расширения приложения?
Вот мои файлы:
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
с suiteName
, соответствующим идентификатору группы, для отправки общего экземпляра, но при получении в расширении приложения адресная память не совпадает, это создает другой экземпляр объекта (я хочу настоящий синглтон между приложением и расширением приложения). Я не знаю, как сэкономить память на расширении приложения и как обмениваться данными между двумя платформами, расширением приложения и приложением, чтобы использовать один и тот же синглтон в каждой части проекта.
Вот иерархия моего проекта :