首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >程序Swift的重复执行

程序Swift的重复执行
EN

Stack Overflow用户
提问于 2022-03-04 17:49:11
回答 1查看 85关注 0票数 0

我有一个程序,从mac获取一些系统信息,比如用户列表和最后会话。

我有一个带有一些值的配置plist,我序列化了这个plist并用这个数据创建了一个AssessmentConfiguration对象--我的Plist:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>OutputFile</key>
    <string>/tmp/empress_assessment_output.txt</string>
    <key>ErrorFile</key>
    <string>/tmp/empress_assessment_error.txt</string>
    <key>RunConfiguration</key>
    <dict>
        <key>RunInterval</key>
        <integer>30</integer>
        <key>Iterations</key>
        <integer>3</integer>
    </dict>
</dict>
</plist>

我的函数使用plist值init AssessmentConfiguration对象

代码语言:javascript
复制
private func parseConfiguration(dictionary: Dictionary<String, Any>) throws -> AssessmentConfiguration {
        
        guard let outputFile = dictionary["OutputFile"] as? String else {
            throw ValidateError.empty
        }
        guard let errorFile = dictionary["ErrorFile"] as? String else {
            throw ValidateError.empty
        }
        guard let runConfiguration = dictionary["RunConfiguration"] as? Dictionary <String, Any> else {
            throw ValidateError.empty
        }
        
        guard let runInterval = runConfiguration["RunInterval"] as? TimeInterval else {
            throw ValidateError.empty
        }
        
        guard let iterations = runConfiguration["Iterations"] as? Int else {
            throw ValidateError.empty
        }
        
        return AssessmentConfiguration(
            outputFile: URL(fileURLWithPath: outputFile),
            errorFile: URL(fileURLWithPath: errorFile),
            runConfiguration: AssessmentConfiguration.RunConfiguration(runInterval: runInterval, iterations: iterations)
        )
    }
    
    func getConfiguration() throws -> AssessmentConfiguration {
        let path =  try getConfigurationFilePath()
        let myDict = try getDictionary(filePath: path)
        let configuration = try parseConfiguration(dictionary: myDict)
        return configuration
    }

这个程序将执行几次。RunConfiguration对象将配置这种情况的发生方式。⁃RunInterval表示执行命令集之间的时间量。⁃迭代表示将执行命令集的迭代次数。例如:如果RunInterval == 30和Iterations == 3,命令集将在启动时运行,然后在30秒后再次运行,再次使用所有命令执行3次并以退出代码0终止。

返回getConfiguration()的最佳方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2022-03-04 22:50:21

我看到你正在沿着自己实现这种调度行为的道路前进。它基本上可以归结为使用for循环和Timer,但我不建议这样做,因为:

  • 这个“监督者”代码必须不断运行,浪费系统资源。
  • 这是更多的工作,因为你必须自己建造它。

相反,我建议您使用现有的工具,对于macOS来说,就是使用launchd来启动一个启动代理或守护进程。您只需定义一个作业(一个plist文件),它配置要运行的内容,以及响应哪些事件(可能是时间,但也支持响应文件夹中显示的文件、插入的USB设备等)。从那里开始,launchd将负责在正确的时间启动您的程序。

有关详情,请参阅苹果的守护进程和服务编程指南

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71355358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档