diff --git a/Foundation/Operation.swift b/Foundation/Operation.swift index 0a845a0451..8d6e537759 100644 --- a/Foundation/Operation.swift +++ b/Foundation/Operation.swift @@ -429,7 +429,7 @@ open class Operation : NSObject { } } } - + open func addDependency(_ op: Operation) { _addDependency(op) } @@ -668,22 +668,16 @@ open class BlockOperation : Operation { } _lock() defer { _unlock() } - if _block == nil && _executionBlocks == nil { + if _block == nil { _block = block + } else if _executionBlocks == nil { + _executionBlocks = [block] } else { - if _executionBlocks == nil { - if let existing = _block { - _executionBlocks = [existing, block] - } else { - _executionBlocks = [block] - } - } else { - _executionBlocks?.append(block) - } + _executionBlocks?.append(block) } } - open var executionBlocks: [@convention(block) () -> Void] { + open var executionBlocks: [() -> Void] { get { _lock() defer { _unlock() } diff --git a/TestFoundation/TestOperationQueue.swift b/TestFoundation/TestOperationQueue.swift index 250e521e4a..7a60d7778d 100644 --- a/TestFoundation/TestOperationQueue.swift +++ b/TestFoundation/TestOperationQueue.swift @@ -26,6 +26,7 @@ class TestOperationQueue : XCTestCase { ("test_CurrentQueueWithUnderlyingQueueResetToNil", test_CurrentQueueWithUnderlyingQueueResetToNil), ("test_isSuspended", test_isSuspended), ("test_OperationDependencyCount", test_OperationDependencyCount), + ("test_BlockOperationAddExecutionBlock", test_BlockOperationAddExecutionBlock) ] } @@ -279,6 +280,21 @@ class TestOperationQueue : XCTestCase { op1.addDependency(op2) XCTAssert(op1.dependencies.count == 1) } + + func test_BlockOperationAddExecutionBlock() { + var msgOperations = [String]() + let blockOperation = BlockOperation { + msgOperations.append("block1 executed") + } + blockOperation.addExecutionBlock { + msgOperations.append("block2 executec") + } + XCTAssert(blockOperation.executionBlocks.count == 2) + let queue = OperationQueue() + queue.addOperation(blockOperation) + queue.waitUntilAllOperationsAreFinished() + XCTAssertEqual(msgOperations, ["block1 executed", "block2 executec"]) + } } class AsyncOperation: Operation {