Skip to content

Commit d6bf0ad

Browse files
committed
WIP on SYNQueue
1 parent c2cec14 commit d6bf0ad

6 files changed

Lines changed: 227 additions & 4 deletions

File tree

SYNQueue/SYNQueue.xcodeproj/project.pbxproj

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
9F6202371B333AAF0026CE2C /* SYNQueue.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F62022B1B333AAF0026CE2C /* SYNQueue.framework */; };
1212
9F62023E1B333AAF0026CE2C /* SYNQueueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F62023D1B333AAF0026CE2C /* SYNQueueTests.swift */; };
1313
9FD63F871B333B81001BD09A /* SYNQueueTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FD63F861B333B81001BD09A /* SYNQueueTask.swift */; };
14+
9FD63FBD1B3342C6001BD09A /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FD63FBC1B3342C6001BD09A /* Utils.swift */; };
15+
9FD63FBF1B334316001BD09A /* NSDate+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FD63FBE1B334316001BD09A /* NSDate+Utils.swift */; };
16+
9FD63FC11B335579001BD09A /* SYNQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FD63FC01B335579001BD09A /* SYNQueue.swift */; };
1417
/* End PBXBuildFile section */
1518

1619
/* Begin PBXContainerItemProxy section */
@@ -31,6 +34,9 @@
3134
9F62023C1B333AAF0026CE2C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
3235
9F62023D1B333AAF0026CE2C /* SYNQueueTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SYNQueueTests.swift; sourceTree = "<group>"; };
3336
9FD63F861B333B81001BD09A /* SYNQueueTask.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SYNQueueTask.swift; sourceTree = "<group>"; };
37+
9FD63FBC1B3342C6001BD09A /* Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = "<group>"; };
38+
9FD63FBE1B334316001BD09A /* NSDate+Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSDate+Utils.swift"; sourceTree = "<group>"; };
39+
9FD63FC01B335579001BD09A /* SYNQueue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SYNQueue.swift; sourceTree = "<group>"; };
3440
/* End PBXFileReference section */
3541

3642
/* Begin PBXFrameworksBuildPhase section */
@@ -73,9 +79,12 @@
7379
9F62022D1B333AAF0026CE2C /* SYNQueue */ = {
7480
isa = PBXGroup;
7581
children = (
76-
9F6202301B333AAF0026CE2C /* SYNQueue.h */,
7782
9F62022E1B333AAF0026CE2C /* Supporting Files */,
83+
9FD63FBE1B334316001BD09A /* NSDate+Utils.swift */,
84+
9F6202301B333AAF0026CE2C /* SYNQueue.h */,
85+
9FD63FC01B335579001BD09A /* SYNQueue.swift */,
7886
9FD63F861B333B81001BD09A /* SYNQueueTask.swift */,
87+
9FD63FBC1B3342C6001BD09A /* Utils.swift */,
7988
);
8089
path = SYNQueue;
8190
sourceTree = "<group>";
@@ -214,7 +223,10 @@
214223
isa = PBXSourcesBuildPhase;
215224
buildActionMask = 2147483647;
216225
files = (
226+
9FD63FC11B335579001BD09A /* SYNQueue.swift in Sources */,
217227
9FD63F871B333B81001BD09A /* SYNQueueTask.swift in Sources */,
228+
9FD63FBF1B334316001BD09A /* NSDate+Utils.swift in Sources */,
229+
9FD63FBD1B3342C6001BD09A /* Utils.swift in Sources */,
218230
);
219231
runOnlyForDeploymentPostprocessing = 0;
220232
};
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
//
2+
// NSDate+Utils.swift
3+
// SYNQueue
4+
//
5+
// Created by John Hurliman on 6/18/15.
6+
// Copyright (c) 2015 Syntertainment. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
class ISOFormatter : NSDateFormatter {
12+
override init() {
13+
super.init()
14+
self.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z"
15+
self.timeZone = NSTimeZone(forSecondsFromGMT: 0)
16+
self.calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierISO8601)!
17+
self.locale = NSLocale(localeIdentifier: "en_US_POSIX")
18+
}
19+
20+
required init(coder aDecoder: NSCoder) {
21+
super.init(coder: aDecoder)
22+
}
23+
}
24+
25+
extension NSDate {
26+
convenience init?(dateString:String) {
27+
let formatter = NSDateFormatter()
28+
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z"
29+
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
30+
if let d = formatter.dateFromString(dateString) {
31+
self.init(timeInterval:0, sinceDate:d)
32+
} else {
33+
self.init(timeInterval:0, sinceDate:NSDate())
34+
}
35+
36+
return nil
37+
}
38+
39+
var isoFormatter: ISOFormatter {
40+
if let formatter = objc_getAssociatedObject(self, "formatter") as? ISOFormatter {
41+
return formatter
42+
} else {
43+
let formatter = ISOFormatter()
44+
objc_setAssociatedObject(self, "formatter", formatter, UInt(OBJC_ASSOCIATION_RETAIN))
45+
return formatter
46+
}
47+
}
48+
49+
func toISOString() -> String {
50+
return self.isoFormatter.stringFromDate(self)
51+
}
52+
}

SYNQueue/SYNQueue/SYNQueue.swift

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
//
2+
// SYNQueue.swift
3+
// SYNQueue
4+
//
5+
// Created by John Hurliman on 6/18/15.
6+
// Copyright (c) 2015 Syntertainment. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
public class SYNQueue : NSOperationQueue {
12+
let taskHandler: SYNTaskCallback
13+
14+
public init(queueName: String, maxConcurrency: Int, taskHandler: SYNTaskCallback) {
15+
self.taskHandler = taskHandler
16+
17+
super.init()
18+
19+
self.name = queueName
20+
self.maxConcurrentOperationCount = maxConcurrency
21+
}
22+
23+
// public convenience init(dictionary: [String: AnyObject?]) {
24+
// // FIXME:
25+
// }
26+
27+
override public func addOperation(op: NSOperation) {
28+
// FIXME: Serialization
29+
30+
super.addOperation(op)
31+
}
32+
33+
public func toDictionary() -> [String: AnyObject?] {
34+
return [:]
35+
}
36+
37+
func runTask(task:SYNQueueTask) {
38+
39+
}
40+
}

SYNQueue/SYNQueue/SYNQueueTask.swift

Lines changed: 91 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,98 @@
88

99
import Foundation
1010

11+
public typealias SYNTaskCallback = (NSError?, SYNQueueTask) -> Void
12+
public typealias JSONDictionary = [String: AnyObject?]
13+
1114
@objc
12-
public class SYNQueueTask {
13-
public init() {
15+
public class SYNQueueTask : NSOperation {
16+
public let queueName: String
17+
public let data: [String: AnyObject]
18+
let dependencyStrs: [String]
19+
let created: NSDate
20+
var started: NSDate?
21+
var retries: Int
22+
23+
public override var asynchronous:Bool { return true }
24+
public override var executing:Bool = false
25+
public override var finished:Bool = false
26+
27+
public init(taskID: String, queueName: String, dependencyStrs: [String],
28+
queuePriority: NSOperationQueuePriority, qualityOfService: NSQualityOfService,
29+
data: [String: AnyObject], created: NSDate, started: NSDate?, retries: Int)
30+
{
31+
self.queueName = queueName
32+
self.dependencyStrs = dependencyStrs
33+
self.data = data
34+
self.created = created
35+
self.started = started
36+
self.retries = retries
37+
38+
super.init()
39+
40+
self.name = taskID
41+
self.queuePriority = queuePriority
42+
self.qualityOfService = qualityOfService
43+
}
44+
45+
public convenience init?(dictionary: JSONDictionary) {
46+
if let taskID = dictionary["taskID"] as? String,
47+
let queueName = dictionary["queueName"] as? String,
48+
let dependencyStrs = dictionary["dependencies"] as? [String],
49+
let queuePriority = dictionary["queuePriority"] as? NSOperationQueuePriority,
50+
let qualityOfService = dictionary["qualityOfService"] as? NSQualityOfService,
51+
let data = dictionary["data"] as? [String: AnyObject],
52+
let createdStr = dictionary["created"] as? String,
53+
let startedStr = dictionary["started"] as? String?,
54+
let retries = dictionary["retries"] as? Int
55+
{
56+
let created = NSDate(dateString: createdStr) ?? NSDate()
57+
let started = (startedStr != nil) ? NSDate(dateString: startedStr!) : nil
58+
59+
self.init(taskID: taskID, queueName: queueName, dependencyStrs: dependencyStrs,
60+
queuePriority: queuePriority, qualityOfService: qualityOfService,
61+
data: data, created: created, started: started, retries: retries)
62+
} else {
63+
self.init(taskID: "", queueName: "", dependencyStrs: [],
64+
queuePriority: .VeryLow, qualityOfService: .Default,
65+
data: [String: AnyObject](), created: NSDate(), started: NSDate(), retries: 0)
66+
}
67+
68+
return nil
69+
}
70+
71+
public func setupDependencies(allTasks: [SYNQueueTask]) {
72+
dependencyStrs.map {
73+
(taskID: String) -> Void in
74+
75+
let found = allTasks.filter({ taskID == $0.name })
76+
if let task = found.first {
77+
self.addDependency(task)
78+
} else {
79+
let name = self.name ?? "(unknown)"
80+
print("Discarding missing dependency \(taskID) from \(name)")
81+
}
82+
}
83+
}
84+
85+
public func toDictionary() -> [String: AnyObject?] {
86+
var dict = [String: AnyObject?]()
87+
dict["taskID"] = self.name
88+
dict["queueName"] = self.queueName
89+
dict["dependencies"] = self.dependencyStrs
90+
dict["queuePriority"] = self.queuePriority.rawValue
91+
dict["qualityOfService"] = self.qualityOfService.rawValue
92+
dict["data"] = self.data
93+
dict["created"] = self.created.toISOString()
94+
dict["started"] = (self.started != nil) ? self.started!.toISOString() : nil
95+
dict["retries"] = self.retries
96+
97+
return dict
98+
}
99+
100+
override public func start() {
101+
executing = true
102+
finished = false
14103

15104
}
16105
}

SYNQueue/SYNQueue/Utils.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//
2+
// Utils.swift
3+
// SYNQueue
4+
//
5+
// Created by John Hurliman on 6/18/15.
6+
// Copyright (c) 2015 Syntertainment. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
class Utils {
12+
13+
}
14+

SYNQueueDemo/SYNQueueDemo/ViewController.swift

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,23 @@ class ViewController: UIViewController {
1414
override func viewDidLoad() {
1515
super.viewDidLoad()
1616

17-
let task = SYNQueueTask()
17+
let queueName = ""
18+
let queue = SYNQueue(queueName: queueName, maxConcurrency: 2) {
19+
(err: NSError?, task: SYNQueueTask) in
20+
if let err = err {
21+
print("Queue error: \(err)")
22+
return
23+
}
24+
25+
let taskType = task.data["type"] {
26+
switch taskType {
27+
28+
}
29+
}
30+
task.completed(nil)
31+
32+
print("Dequeued \(task.name) on queue \(queueName)")
33+
}
1834
}
1935

2036
override func didReceiveMemoryWarning() {

0 commit comments

Comments
 (0)