GCBCore 1.0.2

GCBCore 1.0.2

测试已测试
语言语言 SwiftSwift
许可证 自定义
发布最后发布2016年6月
SPM支持 SPM

Oktawian Chojnacki 维护。



 
依赖项
Alamofire~> 3.0
Decodable~> 0.4
 

GCBCore 1.0.2

Apple TV 的中心板

image

在您的开放式空间或团队室中挂上一个电视,向大家展示发生了什么,并让他们跟上进度。

这是一个轻量级的代码片段。电视屏幕要以横向模式使用,并将被分割成从远程配置文件加载的六个矩形小部件。这只是一个 UIView,所以您可以用任何您想的方式使用这个空间。尽管如此,小部件的更新是标准化的,因此您不应忽略这个约定。

👷项目维护者:@nsmeme(Oktawian Chojnacki)

甚至不用问 - 它显然完全是用♥️ Swift 2.2.

GCBCore

加载配置、初始化并显示板的所需源代码集合。

用法

这就是您配置中心板的方式

let autoStack = AutoStack()
let scheduler = Scheduler()
let dataDownloader = DataDownloader()

let availableBuilders: [WidgetBuilding] = [
    ImageWidgetBuilder(dataDownloader: dataDownloader),
]

let configFileName = NSBundle.localConfigurationFileName
let configurationFetching = LocalConfigurationLoader(configFileName: configFileName,
                                                     availableBuilders: availableBuilders)

let boardController = GrandCentralBoardController(scheduler: self.scheduler, stack: self.autoStack)

let configurationRefresher = ConfigurationRefresher(interval: configRefreshInterval,
                                                    configuree: boardController,
                                                    fetcher: configurationFetching)

// in ViewController:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    view = autoStack

    configurationRefresher.start()
}

贡献

如果您想做出贡献,请在 GitHub 创建一个 issue,并和我们一起讨论您的计划。这样我们可以为您提供帮助,并确保人们不会在相同的事情上工作。

如果您想打开 Pull Request,请确保您已安装 SwiftLint,并检查您的项目不生成警告或错误。任何警告都将导致 Travis build 脚本失败。

小部件

添加新小部件

有一个单独的文章(TUTORIAL.md)覆盖添加新小部件。

组件

一个小部件由四个主要组件组成

  • 视图:一个实现 ViewModelRendering 协议的视图,用来显示信息。
  • :实现了一种更新策略(下面将进一步描述)。
  • 小部件:一个实现 Widget 协议的控制器类,它暴露给调度程序,并连接前两个组件。
  • WidgetBuilder:实现WidgetBuilding协议,使用配置文件中的设置实例化Widget。

尺寸

1080p的Widget画布

  • 640pt x 540pt

此尺寸是固定的,在tvOS上不会改变。

GCBCore v2.0将支持iOS目标,但画布尺寸尚未定义。

配置

有两种方法可以配置Grand Central Board:使用遥控器或捆绑的配置文件。使用如下格式的JSON文件来配置Grand Central Board

{ "widgets":[ 
    {"name":"somewatch", "settings":  {"timeZone":"Europe/Warsaw"} },
    {"name":"somewatch", "settings":  {"timeZone":"Europe/Warsaw"} },
    {"name":"somewatch", "settings":  {"timeZone":"Europe/Warsaw"} },
    {"name":"somewatch", "settings":  {"timeZone":"Europe/Warsaw"} },
    {"name":"somewatch", "settings":  {"timeZone":"Europe/Warsaw"} },
    {"name":"somewatch", "settings":  {"timeZone":"Europe/Warsaw"} }
]}

注意:每个widget都会有自己的设置属性。

配置文件的加载方式在Info.plist文件中指定。image

远程配置文件

要从远程位置加载配置文件,编辑Info.plist并将GCBRemoteConfigurationPath设置为所需位置。确保将GCBAlwaysUseLocalConfigurationFile设置为NO

捆绑配置文件

要使用捆绑配置文件,将Info.plist中的GCBAlwaysUseLocalConfigurationFile设置为YES。如有必要,编辑GCBLocalConfigurationFileName并检查文件是否在“构建阶段”的“拷贝捆绑资源”中列出。出于开发目的,您还可以通过使用GrandCentralBoard-LocalConfig模式来启动应用程序。

视图状态

Widget视图应显示以下状态

  • 等待 - 启动状态,显示一些指示器。
  • 渲染 - 显示信息(在调用渲染方法后)。
  • 失败 - 数据加载失败,应尽量避免。

来源

来源应实现其中两个协议之一

  • 同步 - 来源将以非阻塞方式同步返回值。
protocol Synchronous : Source {
    func read() -> ResultType
}
  • 异步 - 来源将在获取值后调用提供的块(仅调用一次)。
protocol Asynchronous : Source {
    func read(closure: (ResultType) -> Void)
}
  • 可订阅的 - 每次有新值到达时,来源将调用提供的块(多次)。请注意,interval可能会被忽略。
public protocol Subscribable : Source {
    var subscriptionBlock: ((ResultType) -> Void)? { get set }
}

失败可以静默处理,但对于某些widget,可能需要显示失败状态,选择权在您。

所有策略都继承自Source协议

public enum SourceType {
    case Cumulative
    case Momentary
}

public protocol UpdatingSource : class {
    var interval: NSTimeInterval { get }
}

public protocol Source : UpdatingSource {

    associatedtype ResultType

    var sourceType: SourceType { get }
}

致谢