From dd00fb8bf1974a94929fbca459d247e5a39d800c Mon Sep 17 00:00:00 2001 From: Matt Massicotte <85322+mattmassicotte@users.noreply.github.com> Date: Mon, 4 Feb 2019 20:15:25 -0500 Subject: [PATCH] addAsyncOperation added --- OperationPlus/AsyncBlockOperation.swift | 6 ++++-- .../Extensions/OperationQueue+Enqueuing.swift | 4 ++++ OperationPlusTests/OperationQueueTests.swift | 15 +++++++++++++++ README.md | 11 +++++++++++ 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/OperationPlus/AsyncBlockOperation.swift b/OperationPlus/AsyncBlockOperation.swift index 7b61bbd..0d621d6 100644 --- a/OperationPlus/AsyncBlockOperation.swift +++ b/OperationPlus/AsyncBlockOperation.swift @@ -9,9 +9,11 @@ import Foundation public class AsyncBlockOperation: AsyncOperation { - private let block: (@escaping () -> Void) -> Void + public typealias CompletionHandler = (@escaping () -> Void) -> Void - public init(block: @escaping (@escaping () -> Void) -> Void) { + private let block: CompletionHandler + + public init(block: @escaping CompletionHandler) { self.block = block } diff --git a/OperationPlus/Extensions/OperationQueue+Enqueuing.swift b/OperationPlus/Extensions/OperationQueue+Enqueuing.swift index 82ce6ec..9b1785d 100644 --- a/OperationPlus/Extensions/OperationQueue+Enqueuing.swift +++ b/OperationPlus/Extensions/OperationQueue+Enqueuing.swift @@ -18,4 +18,8 @@ extension OperationQueue { public func addOperations(_ ops: [Operation]) { addOperations(ops, waitUntilFinished: false) } + + public func addAsyncOperation(block: @escaping AsyncBlockOperation.CompletionHandler) { + addOperation(AsyncBlockOperation(block: block)) + } } diff --git a/OperationPlusTests/OperationQueueTests.swift b/OperationPlusTests/OperationQueueTests.swift index 71123e0..4399f2d 100644 --- a/OperationPlusTests/OperationQueueTests.swift +++ b/OperationPlusTests/OperationQueueTests.swift @@ -62,4 +62,19 @@ class OperationQueueTests: XCTestCase { wait(for: [expectation], timeout: 1.0) } + + func testAddAsyncBlock() { + let queue = OperationQueue.serialQueue() + + let blockExpecation = XCTestExpectation(description: "Block Expectation") + + queue.addAsyncOperation { (completionHandler) in + blockExpecation.fulfill() + completionHandler() + } + + let nextOpExpectation = OperationExpectation(operation: Operation(), queue: queue) + + wait(for: [blockExpecation, nextOpExpectation], timeout: 1.0, enforceOrder: true) + } } diff --git a/README.md b/README.md index b7b2f5b..508c3f0 100644 --- a/README.md +++ b/README.md @@ -189,6 +189,17 @@ queue.currentOperationsFinished { } ``` +Convenient inline functions: + +```swift +queue.addAsyncOperation { (completionHandler) in + DispatchQueue.global().async { + // do some async work + completionHandler() + } +} +``` + ### XCTest Support **OperationTestingPlus** is an optional micro-framework to help make your XCTest-based tests a little nicer. When using Carthage, it is built as a static framework to help ease integration with your testing targets.