-
Notifications
You must be signed in to change notification settings - Fork 0
/
MockDataLoader.swift
63 lines (52 loc) · 2.13 KB
/
MockDataLoader.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// The MIT License (MIT)
//
// Copyright (c) 2015-2022 Alexander Grebenyuk (github.com/kean).
import Foundation
import Nuke
private let data: Data = Test.data(name: "fixture", extension: "jpeg")
private final class MockDataTask: Cancellable, @unchecked Sendable {
var _cancel: () -> Void = { }
func cancel() {
_cancel()
}
}
class MockDataLoader: DataLoading, @unchecked Sendable {
static let DidStartTask = Notification.Name("com.github.kean.Nuke.Tests.MockDataLoader.DidStartTask")
static let DidCancelTask = Notification.Name("com.github.kean.Nuke.Tests.MockDataLoader.DidCancelTask")
@Atomic var createdTaskCount = 0
var results = [URL: Result<(Data, URLResponse), NSError>]()
let queue = OperationQueue()
var isSuspended: Bool {
get { queue.isSuspended }
set { queue.isSuspended = newValue }
}
func loadData(with request: URLRequest, didReceiveData: @escaping (Data, URLResponse) -> Void, completion: @escaping (Error?) -> Void) -> Cancellable {
let task = MockDataTask()
NotificationCenter.default.post(name: MockDataLoader.DidStartTask, object: self)
createdTaskCount += 1
let operation = BlockOperation {
if let result = self.results[request.url!] {
switch result {
case let .success(val):
let data = val.0
if !data.isEmpty {
didReceiveData(data.prefix(data.count / 2), val.1)
didReceiveData(data.suffix(data.count / 2), val.1)
}
completion(nil)
case let .failure(err):
completion(err)
}
} else {
didReceiveData(data, URLResponse(url: request.url ?? Test.url, mimeType: "jpeg", expectedContentLength: 22789, textEncodingName: nil))
completion(nil)
}
}
queue.addOperation(operation)
task._cancel = {
NotificationCenter.default.post(name: MockDataLoader.DidCancelTask, object: self)
operation.cancel()
}
return task
}
}