金沙国际官网_金沙国际平台登录

因为这个金沙国际官网_金沙国际平台登录网站与很多的大型澳门赌场都有合作,金沙国际官网_金沙国际平台登录尽职尽责,高效执行,保持好奇心,不断学习,追求卓越,点击进入金沙国际官网_金沙国际平台登录马上体验吧,所以现在也正式地开始了营业。

您的位置:金沙国际官网 > 编程 > 每天5分钟玩转,例子代码

每天5分钟玩转,例子代码

发布时间:2019-11-06 11:06编辑:编程浏览(123)

    service 的容器副本会 scale up/down,会 failover,会在不同的主机上创建和销毁,这就引出一个问题,如果 service 有要管理的数据,那么这些数据应该如何存放呢?

    属性

    苹果官方文档 Properties

    苹果官方文档翻译 属性

    属性可以将值与特定的类、结构体或者是枚举联系起来。

    GameplayKit是一个面向对象的框架,为构建游戏提供基础工具和技术。 GameplayKit包含用于设计具有功能性,可重用架构的游戏的工具,以及用于构建和增强诸如角色移动和对手行为的游戏玩法特征的技术。

    选项一:打包在容器里。

    存储属性

    struct FixedLengthRange {
        var firstValue: Int
        let length: Int
    }
    var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
    rangeOfThreeItems.firstValue = 6
    // the range now represents integer values 6, 7, and 8
    

     

    显然不行。除非数据不会发生变化,否则,如何在多个副本直接保持同步呢?

    常量结构体实例的储存属性

    let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)
    // this range represents integer values 0, 1, 2, and 3
    rangeOfFourItems.firstValue = 6
    // this will report an error, even though firstValue is a variable property
    

    图片 1

    选项二:数据放在 Docker 主机的本地目录中,通过 volume 映射到容器里。

    延迟储存属性

    延迟存储属性的初始值在其第一次使用时才进行计算。声明前标注 lazy 修饰语来表示一个延迟存储属性。且声明必须为变量。

    class DataImporter {
    
        //DataImporter is a class to import data from an external file.
        //The class is assumed to take a non-trivial amount of time to initialize.
    
        var fileName = "data.txt"
        // the DataImporter class would provide data importing functionality here
    }
    
    class DataManager {
        lazy var importer = DataImporter()
        var data = [String]()
        // the DataManager class would provide data management functionality here
    }
    
    let manager = DataManager()
    manager.data.append("Some data")
    manager.data.append("Some more data")
    // the DataImporter instance for the importer property has not yet been created
    
    print(manager.importer.fileName)
    // the DataImporter instance for the importer property has now been created
    // prints "data.txt"
    

    GamePlayKit

    位于同一个主机的副本倒是能够共享这个 volume,但不同主机中的副本如何同步呢?

    储存属性与实例变量

    Swift 属性没有与之相对应的实例变量,并且属性的后备存储不能被直接访问。

    我们这里主要讲GKEntity和GKComponent这二个类;

    选项三:利用 Docker 的 volume driver,由外部 storage provider 管理和提供 volume,所有 Docker 主机 volume 将挂载到各个副本。

    计算属性

    图片 2

    struct Point {
        var x = 0.0, y = 0.0
    }
    struct Size {
        var width = 0.0, height = 0.0
    }
    struct Rect {
        var origin = Point()
        var size = Size()
        var center: Point {
            get {
                let centerX = origin.x + (size.width / 2)
                let centerY = origin.y + (size.height / 2)
                return Point(x: centerX, y: centerY)
            }
            set(newCenter) {
                origin.x = newCenter.x - (size.width / 2)
                origin.y = newCenter.y - (size.height / 2)
            }
        }
    }
    var square = Rect(origin: Point(x: 0.0, y: 0.0),
        size: Size(width: 10.0, height: 10.0))
    let initialSquareCenter = square.center
    square.center = Point(x: 15.0, y: 15.0)
    print("square.origin is now at ((square.origin.x), (square.origin.y))")
    // prints "square.origin is now at (10.0, 10.0)"
    

    GKEntity类(实体): 可以容纳很多组件的容器,根据自己的需求来加入相应的Component组件。

    GKComponent类(组件):代表一种功能和行为,不同的组件代表不同的功能。

    每天5分钟玩转,例子代码。这是目前最佳的方案。volume 不依赖 Docker 主机和容器,生命周期由 storage provider 管理,volume 的高可用和数据有效性也全权由 provider 负责,Docker 只管使用。

    简写设置器(setter)声明

    如果一个计算属性的设置器没有为将要被设置的值定义一个名字,那么他将被默认命名为 newValue 。

    struct AlternativeRect {
        var origin = Point()
        var size = Size()
        var center: Point {
            get {
                let centerX = origin.x + (size.width / 2)
                let centerY = origin.y + (size.height / 2)
                return Point(x: centerX, y: centerY)
            }
            set {
                origin.x = newValue.x - (size.width / 2)
                origin.y = newValue.y - (size.height / 2)
            }
        }
    }
    

    实用功能
    (1)方便通过聚合多种组件,构建复杂的新实体Entity。
    (2)不同的实体GKEntity,通过聚合不同种类的组件GKComponent来实现。
    (3)不必重复写组件,组件可以复用,也易于扩展。
    (4)实体可以实现动态添加组件,以动态获得或者删除某些功能。

    我们将以 Rex-Ray 为例来实践第三种方案。

    只读计算属性

    一个有读取器但是没有设置器的计算属性就是所谓的只读计算属性。

    去掉 get 关键字和他的大扩号来简化只读计算属性的声明:

    struct Cuboid {
        var width = 0.0, height = 0.0, depth = 0.0
        var volume: Double {
            return width * height * depth
        }
    }
    let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)
    print("the volume of fourByFiveByTwo is (fourByFiveByTwo.volume)")
    // prints "the volume of fourByFiveByTwo is 40.0"
    

    直接通过代码来理解这二个类:

    Rex-Ray

    Rex-Ray 是开源的容器存储管理解决方案。支持主流的容器编排引擎 Docker Swarm、 Kubernetes 和 Mesos,为容器集群提供自动化的存储编排功能。

    在《每天5分钟玩转Docker容器技术》的数据管理章节中已经详细讨论了 Rex-Ray 如何跨 Docker 主机管理 data volume,本节内容也是建立在这些基础知识之上。为节省篇幅,建议大家先阅读这些内容,然后回到这里继续实践。

    我们将在部署如下的 Rex-Ray 实验环境:

    图片 3

    1. swarm 中的所有 node 都安装部署 Rex-Ray。

    2. Rex-Ray 使用 VirtualBox backend。

    3. 具体的安装部署方法请参考前面 Docker 数据管理章节,这里不再赘述。

    属性观察者

    属性观察者会观察并对属性值的变化做出回应。

    • willSet 会在该值被存储之前被调用。
    • didSet 会在一个新值被存储后被调用。
    class StepCounter {
        var totalSteps: Int = 0 {
            willSet(newTotalSteps) {
                print("About to set totalSteps to (newTotalSteps)")
            }
            didSet {
                if totalSteps > oldValue  {
                    print("Added (totalSteps - oldValue) steps")
                }
            }
        }
    }
    let stepCounter = StepCounter()
    stepCounter.totalSteps = 200
    // About to set totalSteps to 200
    // Added 200 steps
    stepCounter.totalSteps = 360
    // About to set totalSteps to 360
    // Added 160 steps
    stepCounter.totalSteps = 896
    // About to set totalSteps to 896
    // Added 536 steps
    

     

    本文由金沙国际官网发布于编程,转载请注明出处:每天5分钟玩转,例子代码

    关键词:

上一篇:基础介绍,语法速览

下一篇:没有了