首先,我理解值和引用类型之间的区别 - 这不是那个问题.我在Swift中重写了一些代码,并决定重构一些类.因此,我想我会看到一些类是否有意义作为结构.
内存:我有一些模型类,它们包含非常大的数组,它们的大小不断增长(最终大小未知),并且可能存在数小时.首先,是否存在关于结构的建议大小或绝对大小的指导,因为它存在于堆栈中?
重构使用:由于我正在重构现在的乱七八糟的依赖,我想知道如何改进.视图和视图控制器大多很容易,它是我的模型,它的功能,总是让我希望有更好的例子可以遵循.
WorkerManager:Singleton一次持有一个或两个Workers.一个将始终从传感器记录新数据,另一个将审查存储的数据.视图控制器从中获取Worker引用WorkerManager,并要求Worker显示数据.
Worker:队列中的所有内容,以防止内存访问问题(C数组指针随着它们的增长而不断变化).侦听:侦听Worker侦听新数据,将其发送到一个Processor对象(它创建的),清理数据并将其存储在由C语言持有的C数组中Worker.然后,如果存在有效数据,则Worker告知Analyzer(也由工作者拥有)分析数据并将其存储在其他C数组中以馈送到视图.无论是Processor和Analyzer需要国家知道在过去发生的事情和处理和分析旁边.纯原始数据存储在单独的RecordNSManaged对象中.Reviewer采用Record并使用纯原始数据重新创建所有分析的数据,以便对其进行检查.(分析数据很大,我不想将其存储到磁盘)
现在,我的第二个问题是,可以/应该Processor和Analyzer与结构取代?或者可能是协议Worker?它们不是正常意义上的"对象",只是方便的相关方法组和必要的状态.而且因为每个代码几乎是一千行,我不想把它全部放在一个类,甚至是同一个文件中.
我只是没有很好地理解如何删除我的所有状态,使用纯函数进行在数组上执行的所有复杂数学运算,以及放置它们的位置.
好吧,我的AVAudioSession定义如下(是的,混合了c和obj-c调用)还要注意应用程序有背景模式音频,因为如果录制它必须在应用程序在后台时继续这样做:
[(AVAudioSession *)[AVAudioSession sharedInstance] setDelegate: self];
// Allow the app sound to continue to play when the screen is locked.
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
//Turn off automatic gain on the microphone
[[AVAudioSession sharedInstance] setMode:AVAudioSessionModeMeasurement error:nil];
//Turn on the ability to mix with others
UInt32 doSetProperty = 1;
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);
//Activate the audio session
[[AVAudioSession sharedInstance] setActive:YES error:nil];
Run Code Online (Sandbox Code Playgroud)
该应用程序有几个不同的音频选项(只有前两个已编程):
录制在前台和后台运行良好,我稍后会添加播放.然而,我今晚才注意到,如果音频已经在扬声器上播放(Pandora)并且我进入我的应用程序并激活录音模式,那么它将Pandora切换到通过电话扬声器播放,甚至在音频消息停用后应用程序背景(但不强制关闭)音频继续通过手机扬声器播放,直到我强行关闭应用程序.
//Deactivate the audio session
[[AVAudioSession sharedInstance] setActive:NO error:nil];
Run Code Online (Sandbox Code Playgroud)
另一方面,如果耳机进入并且当应用程序开始进入录制模式时音乐正在通过耳机播放,那么只有短暂停顿并且音乐继续以相同音量播放(正确,没有闪避) .
当我在没有耳机的情况下激活音频会话时,我没有看到为什么路线应该改变的原因,以及为什么在会话停用时它不会改变.特别是换到手机扬声器!有什么东西我做错了,或者我只需要根据用户想要做什么(而不是毯子播放+记录和模式测量)来定义AVAudioSession?即使我需要为不同的用例单独定义它.例如,如果应用程序正在录制,音频将始终通过耳机,如果应用程序未录制,则音频输出耳机或扬声器(取决于用户是否插入了耳机) - 即正常行为).
额外细节
好的,我尝试切换所有代码c并注意到有关kAudioSessionProperty_OverrideAudioRoute的文档中的一个注释 …
iphone cocoa-touch core-audio audio-recording avaudiosession
我正在写一个C数学库的包装器.每个函数都将一个或两个函数作为参数.但是,这些子函数(以及父函数)的参数不是Swifty -hence包装器.
我已经清理了示例代码,只显示了三个主要部分:c-library函数,将传递给包装器的所需Swift函数(未显示的主体,但包围c-library函数),以及所需的C函数形式.
//C library function, that calls the passed function dozens, hundreds or thousands of times, each time it changes the data provided in p, and uses the output from x
//The Swift arrays are passed as pointers, and the length of the and x array are m and n respectively
returnValue = cLibraryFunc(passedFunc, &p, &x, Int32(m), Int32(n), Int32(itmax), &opts, &info, &work, &covar, &adata)
//I would like to create a Swift function that would look like this (internals could …Run Code Online (Sandbox Code Playgroud) 经过大量的阅读和图表,我想我已经提出了一个模型,我可以用它作为更多测试我需要调整哪些参数和功能的基础.但是,我对如何实现以下测试用例感到困惑(所有数字都比最终模型小几个数量级,但我想从小开始):
这是我提出的,编译的.但是,看看model.summary,我想我错过了我希望第一个LSTM在每个输出时间步长的3个输入序列上运行的事实.我究竟做错了什么?
model = Sequential()
model.add(TimeDistributed(Bidirectional(LSTM(11, return_sequences=True, recurrent_dropout=0.1, unit_forget_bias=True), input_shape=(3, 3, epoch_len), merge_mode='sum'), input_shape=(n_epochs, 3, epoch_len)))
model.add(TimeDistributed(Dense(7)))
model.add(TimeDistributed(Flatten()))
model.add(Bidirectional(LSTM(12, return_sequences=True, recurrent_dropout=0.1, unit_forget_bias=True), merge_mode='sum'))
model.add(TimeDistributed(Dense(n_classes, activation='softmax')))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud) swift ×2
arrays ×1
c ×1
cocoa-touch ×1
core-audio ×1
ios ×1
iphone ×1
keras ×1
lstm ×1
refactoring ×1
struct ×1
wrapper ×1