如何在Swift中对NSOperation进行子类化,以将SKAction对象排队以便串行执行?

凯文·欧文斯

Rob为子类化NSOperation提供了一个很棒的Objective-C解决方案,以实现SKAction对象的串行排队机制。我在自己的Swift项目中成功实现了这一点。

import SpriteKit

class ActionOperation : NSOperation
{
    let _node: SKNode // The sprite node on which an action is to be performed
    let _action: SKAction // The action to perform on the sprite node
    var _finished = false // Our read-write mirror of the super's read-only finished property
    var _executing = false // Our read-write mirror of the super's read-only executing property

    /// Override read-only superclass property as read-write.
    override var executing: Bool {
        get { return _executing }
        set {
            willChangeValueForKey("isExecuting")
            _executing = newValue
            didChangeValueForKey("isExecuting")
        }
    }

    /// Override read-only superclass property as read-write.
    override var finished: Bool {
        get { return _finished }
        set {
            willChangeValueForKey("isFinished")
            _finished = newValue
            didChangeValueForKey("isFinished")
        }
    }

    /// Save off node and associated action for when it's time to run the action via start().
    init(node: SKNode, action: SKAction) {

    // This is equiv to ObjC:
    // - (instancetype)initWithNode(SKNode *)node (SKAction *)action
    // See "Exposing Swift Interfaces in Objective-C" at https://developer.apple.com/library/mac/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-XID_35

        _node = node
        _action = action
        super.init()
    }

    /// Add the node action to the main operation queue.
    override func start()
    {
        if cancelled {
            finished = true
            return
        }

        executing = true

        NSOperationQueue.mainQueue().addOperationWithBlock {
            self._node.runAction(self._action) {
                self.executing = false
                self.finished = true
            }
        }
    }
}

要使用ActionOperation,请在客户端类中实例化NSOperationQueue类成员:

var operationQueue = NSOperationQueue()

在您的init方法中添加以下重要行:

operationQueue.maxConcurrentOperationCount = 1; // disallow follow actions from overlapping one another

然后,当您准备向其中添加SKActions使其依次运行时:

operationQueue.addOperation(ActionOperation(node: mySKNode, action: mySKAction))

您是否需要在任何时候终止操作:

operationQueue.cancelAllOperations() // this renders the queue unusable; you will need to recreate it if needing to queue anymore actions

希望有帮助!

林太郎

根据文件

在自定义实现中,isExecuting每当操作对象的执行状态更改时,都必须为键路径生成KVO通知

在自定义实现中,isFinished每当操作对象的完成状态更改时,都必须为键路径生成KVO通知

因此,我认为您必须:

override var executing:Bool {
    get { return _executing }
    set {
        willChangeValueForKey("isExecuting")
        _executing = newValue
        didChangeValueForKey("isExecuting")
    }
}

override var finished:Bool {
    get { return _finished }
    set {
        willChangeValueForKey("isFinished")
        _finished = newValue
        didChangeValueForKey("isFinished")
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Swift中对数组类进行子类化?

来自分类Dev

如何在Swift中对自定义UIViewController进行子类化?

来自分类Dev

如何在Swift中为结构子类化?

来自分类Dev

如何在Swift中使用泛型对另一个类进行子类化?

来自分类Dev

如何在 Swift 中对 SKAction 使用执行方法

来自分类Dev

Swift:如何对CALayer进行子类化,使其自动调整大小?

来自分类Dev

如何在SwiftUI中对@State属性包装器进行子类化

来自分类Dev

使用输入参数崩溃在Swift中对CIFilter进行子类化

来自分类Dev

如何在我子类化的类中的Swift中返回泛型类型

来自分类Dev

通过重试将NSOperation子类化为Internet操作

来自分类Dev

通过重试将NSOperation子类化为Internet操作

来自分类Dev

子类化 UITableViewController 以在 Swift 中再次子类化

来自分类Dev

如何在Cocosdx中修复钻石子类化

来自分类Dev

如何在表单中引用子类化的txtbox

来自分类Dev

解析-使用Swift进行子类化?

来自分类Dev

Swift:如何在子类的init方法中对指令进行排序

来自分类Dev

如何从点击获取SKSpriteNode子类化对象

来自分类Dev

如何从点击获取SKSpriteNode子类化对象

来自分类Dev

Swift子类化-如何覆盖Init()

来自分类Dev

Swift:将UITextView或UICollectionView子类化并进行适当的初始化

来自分类Dev

Swift中的类扩展与子类化?

来自分类Dev

如何在Qt中子类化?

来自分类Dev

如何在RxJava中将Observable子类化?

来自分类Dev

如何在Mocha中将模拟子类化?

来自分类Dev

如何在django中进行过滤,以便将每个对象归类为其正确的父对象?

来自分类Dev

使用Swift和Xcode 6对UIGestureRecognizer进行子类化-如何导入UIGestureRecognizerSubclass.h?

来自分类Dev

当LoginView是初始视图时,在情节提要中对UITabBarController进行子类化[Swift2,Xcode 7]

来自分类Dev

如何在Ember CLI中使用ES6语法对Ember类进行子类化

来自分类Dev

如何在Ember CLI中使用ES6语法对Ember类进行子类化

Related 相关文章

  1. 1

    如何在Swift中对数组类进行子类化?

  2. 2

    如何在Swift中对自定义UIViewController进行子类化?

  3. 3

    如何在Swift中为结构子类化?

  4. 4

    如何在Swift中使用泛型对另一个类进行子类化?

  5. 5

    如何在 Swift 中对 SKAction 使用执行方法

  6. 6

    Swift:如何对CALayer进行子类化,使其自动调整大小?

  7. 7

    如何在SwiftUI中对@State属性包装器进行子类化

  8. 8

    使用输入参数崩溃在Swift中对CIFilter进行子类化

  9. 9

    如何在我子类化的类中的Swift中返回泛型类型

  10. 10

    通过重试将NSOperation子类化为Internet操作

  11. 11

    通过重试将NSOperation子类化为Internet操作

  12. 12

    子类化 UITableViewController 以在 Swift 中再次子类化

  13. 13

    如何在Cocosdx中修复钻石子类化

  14. 14

    如何在表单中引用子类化的txtbox

  15. 15

    解析-使用Swift进行子类化?

  16. 16

    Swift:如何在子类的init方法中对指令进行排序

  17. 17

    如何从点击获取SKSpriteNode子类化对象

  18. 18

    如何从点击获取SKSpriteNode子类化对象

  19. 19

    Swift子类化-如何覆盖Init()

  20. 20

    Swift:将UITextView或UICollectionView子类化并进行适当的初始化

  21. 21

    Swift中的类扩展与子类化?

  22. 22

    如何在Qt中子类化?

  23. 23

    如何在RxJava中将Observable子类化?

  24. 24

    如何在Mocha中将模拟子类化?

  25. 25

    如何在django中进行过滤,以便将每个对象归类为其正确的父对象?

  26. 26

    使用Swift和Xcode 6对UIGestureRecognizer进行子类化-如何导入UIGestureRecognizerSubclass.h?

  27. 27

    当LoginView是初始视图时,在情节提要中对UITabBarController进行子类化[Swift2,Xcode 7]

  28. 28

    如何在Ember CLI中使用ES6语法对Ember类进行子类化

  29. 29

    如何在Ember CLI中使用ES6语法对Ember类进行子类化

热门标签

归档