Skip to content

'Cancel' for PromiseKit option 2 #4

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion Cartfile
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
github "mxcl/PromiseKit" ~> 6.0
#github "mxcl/PromiseKit" ~> 6.0
github "dougzilla32/PromiseKit" "PMKCancel"
#github "PromiseKit/Cancel" ~> 1.0
github "dougzilla32/Cancel" ~> 1.0
3 changes: 2 additions & 1 deletion Cartfile.resolved
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
github "mxcl/PromiseKit" "6.3.3"
github "dougzilla32/Cancel" "1.0.0"
github "dougzilla32/PromiseKit" "a0217bd7b69af68237dcdeee0197e63259b9d445"
1 change: 1 addition & 0 deletions PMKMapKit.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@
);
inputPaths = (
PromiseKit,
PMKCancel,
);
name = "Embed Carthage Frameworks";
outputPaths = (
Expand Down
33 changes: 33 additions & 0 deletions Sources/MKDirections+Promise.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import MapKit
#if !PMKCocoaPods
import PMKCancel
import PromiseKit
#endif

Expand All @@ -24,3 +25,35 @@ extension MKDirections {
return Promise { calculateETA(completionHandler: $0.resolve) }
}
}

//////////////////////////////////////////////////////////// Cancellation

fileprivate class MKDirectionsTask: CancellableTask {
let directions: MKDirections
var cancelAttempted = false

init(_ directions: MKDirections) {
self.directions = directions
}

func cancel() {
directions.cancel()
cancelAttempted = true
}

var isCancelled: Bool {
return cancelAttempted && !directions.isCalculating
}
}

extension MKDirections {
/// Begins calculating the requested route information asynchronously.
public func calculateCC() -> CancellablePromise<MKDirectionsResponse> {
return CancellablePromise(task: MKDirectionsTask(self)) { calculate(completionHandler: $0.resolve) }
}

/// Begins calculating the requested travel-time information asynchronously.
public func calculateETACC() -> CancellablePromise<MKETAResponse> {
return CancellablePromise(task: MKDirectionsTask(self)) { calculateETA(completionHandler: $0.resolve) }
}
}
28 changes: 28 additions & 0 deletions Sources/MKMapSnapshotter+Promise.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import MapKit
#if !PMKCocoaPods
import PMKCancel
import PromiseKit
#endif

Expand All @@ -19,3 +20,30 @@ extension MKMapSnapshotter {
return Promise { start(completionHandler: $0.resolve) }
}
}

//////////////////////////////////////////////////////////// Cancellation

fileprivate class MKMapSnapshotterTask: CancellableTask {
let snapshotter: MKMapSnapshotter
var cancelAttempted = false

init(_ snapshotter: MKMapSnapshotter) {
self.snapshotter = snapshotter
}

func cancel() {
snapshotter.cancel()
cancelAttempted = true
}

var isCancelled: Bool {
return cancelAttempted && !snapshotter.isLoading
}
}

extension MKMapSnapshotter {
/// Starts generating the snapshot using the options set in this object.
public func startCC() -> CancellablePromise<MKMapSnapshot> {
return CancellablePromise(task: MKMapSnapshotterTask(self)) { start(completionHandler: $0.resolve) }
}
}
68 changes: 68 additions & 0 deletions Tests/TestMapKit.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import PromiseKit
import PMKCancel
import PMKMapKit
import MapKit
import XCTest
Expand Down Expand Up @@ -61,3 +62,70 @@ class Test_MKSnapshotter_Swift: XCTestCase {
waitForExpectations(timeout: 1, handler: nil)
}
}

//////////////////////////////////////////////////////////// Cancellation

extension Test_MKDirections_Swift {
func test_cancel_directions_response() {
let ex = expectation(description: "")

class MockDirections: MKDirections {
override func calculate(completionHandler: @escaping MKDirectionsHandler) {
completionHandler(MKDirectionsResponse(), nil)
}
}

let rq = MKDirectionsRequest()
let directions = MockDirections(request: rq)

directions.calculateCC().done { _ in
XCTFail()
}.catch(policy: .allErrors) {
$0.isCancelled ? ex.fulfill() : XCTFail()
}.cancel()

waitForExpectations(timeout: 1, handler: nil)
}


func test_cancel_ETA_response() {
let ex = expectation(description: "")

class MockDirections: MKDirections {
override func calculateETA(completionHandler: @escaping MKETAHandler) {
completionHandler(MKETAResponse(), nil)
}
}

let rq = MKDirectionsRequest()
MockDirections(request: rq).calculateETACC().done { _ in
XCTFail()
}.catch(policy: .allErrors) {
$0.isCancelled ? ex.fulfill() : XCTFail()
}.cancel()

waitForExpectations(timeout: 1, handler: nil)
}

}

extension Test_MKSnapshotter_Swift {
func test_cancel() {
let ex = expectation(description: "")

class MockSnapshotter: MKMapSnapshotter {
override func start(completionHandler: @escaping MKMapSnapshotCompletionHandler) {
completionHandler(MKMapSnapshot(), nil)
}
}

let snapshotter = MockSnapshotter()
snapshotter.startCC().done { _ in
XCTFail()
}.catch(policy: .allErrors) {
$0.isCancelled ? ex.fulfill() : XCTFail()
}.cancel()

waitForExpectations(timeout: 1, handler: nil)
}
}