在取消NSOperationQueue上的所有操作后不久,我怎么处理此异常

时间:2017-03-14 15:04:17

标签: ios swift race-condition nsoperationqueue

每当我cancelAllOperations()时,我都会收到这条奇妙的信息:

  

*由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'* - [__ NSOperationInternal _start:]:某些东西试图同时从多个线程启动接收器'   ***第一次抛出调用堆栈:   (0x1935321c0 0x191f6c55c 0x193532108 0x193f2b788 0x193ff8b00 0x1923bd1c0 0x1923cb444 0x1923c09a8 0x1923cd38c 0x1923cd0ec 0x1925c62b8 0x1925c5da4)   libc ++ abi.dylib:以NSException类型的未捕获异常终止

这可能不是2008年在OSX中发现的同一个bug 并在这里描述 https://www.mikeash.com/pyblog/dont-use-nsoperationqueue.html

虽然在我的情况下,这是一个零努力的出现:一直在旅行。

  1. 这伴随着 < myoperationnameishere> 0x17425e240去了isFinished = YES而没有被它所在的队列启动

  2. 有大量的操作类型,所以我不在这里列出它们。

  3. 但是,所有这些都来自这个类。

    public class AsynchronousOperation: NSOperation {
        // MARK: - Types
        public enum State {
            case Ready, Executing, Finished
            func keyPath() -> String {
                switch self {
                case Ready:
                    return "isReady"
                case Executing:
                    return "isExecuting"
                case Finished:
                    return "isFinished"
                }
            }
        }
    
        public override init() {
            state = State.Ready
            super.init()
        }
    
        // MARK: - Properties
        public var state = State.Ready {
            willSet {
                willChangeValueForKey(newValue.keyPath())
                willChangeValueForKey(state.keyPath())
            }
            didSet {
                Util.log("\(self.dynamicType) \(oldValue) -> \(state)", dc: [.Operation])
                didChangeValueForKey(oldValue.keyPath())
                didChangeValueForKey(state.keyPath())
            }
        }
    
        // MARK: - NSOperation
        override public var ready: Bool {
            return super.ready && state == .Ready
        }
    
        override public var executing: Bool {
            return state == .Executing
        }
    
        override public var finished: Bool {
            return state == .Finished
        }
    
        public override func cancel() {
            super.cancel()
            state = .Finished
        }
    }
    

1 个答案:

答案 0 :(得分:1)

  

这伴随着0x17425e240去了   isFinished = YES,而不是由

中的队列启动

是线索。 以及: NSOperationQueue not working in IOS5

我在覆盖的cancel()方法中将isfinished设置为true 在继承树的下一步操作

这对于尚未取消的操作不正确 已经开始了

现在,这是关闭警报铃声