This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| extension CloudKitRepository { | |
| func cktaskOfTask (_ task: Task, completion: @escaping ((_ ctask: CKRecord?) -> Void)) { | |
| let predicate = NSPredicate(format: "objectId == %@", task.objectId as CVarArg) | |
| let query = CKQuery(recordType: "Task", predicate: predicate) | |
| privateDB.perform(query, inZoneWith: customZone.zoneID) { (results: [CKRecord]?, error) in | |
| if let result = results?.first { | |
| completion(result) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| func deleteTask (_ task: Task, forceDelete: Bool, completion: @escaping ((_ success: Bool) -> Void)) { | |
| cktaskOfTask(task) { (record) in | |
| if let cktask = record { | |
| self.privateDB.delete(withRecordID: cktask.recordID, completionHandler: { (recordID, error) in | |
| completion(error != nil) | |
| }) | |
| } else { | |
| completion(false) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| func queryUpdates (sinceDate: Date, completion: @escaping ([Task], [String], NSError?) -> Void) { | |
| let changeToken = UserDefaults.standard.serverChangeToken | |
| fetchChangedRecords(token: changeToken, | |
| previousRecords: [], | |
| previousDeletedRecordsIds: [], | |
| completion: { (changedRecords, deletedRecordsIds) in | |
| completion(self.tasksFromCKTasks(changedRecords), self.idsFromCKRecordIds(deletedRecordsIds), nil) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import CloudKit | |
| public extension UserDefaults { | |
| var serverChangeToken: CKServerChangeToken? { | |
| get { | |
| guard let data = self.value(forKey: "ChangeToken") as? Data else { | |
| return nil | |
| } | |
| guard let token = NSKeyedUnarchiver.unarchiveObject(with: data) as? CKServerChangeToken else { |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| extension CloudKitRepository { | |
| func fetchRecords (ofType type: String, predicate: NSPredicate, completion: @escaping ((_ ctask: [CKRecord]?) -> Void)) { | |
| let query = CKQuery(recordType: type, predicate: predicate) | |
| privateDB.perform(query, inZoneWith: customZone.zoneID) { (results: [CKRecord]?, error) in | |
| if let results = results { | |
| completion(results) | |
| } else { |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| class CloudKitRepository { | |
| internal let privateDB = CKContainer.default().privateCloudDatabase | |
| internal let customZone = CKRecordZone(zoneName: "TasksZone") | |
| init() { | |
| privateDB.save(customZone) { (recordZone, err) in | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| class SyncTasks { | |
| fileprivate let localRepository: Repository! | |
| fileprivate let remoteRepository: Repository! | |
| fileprivate var tasksToSave = [Task]() | |
| fileprivate var tasksToDelete = [Task]() | |
| init (localRepository: Repository, remoteRepository: Repository) { | |
| self.localRepository = localRepository | |
| self.remoteRepository = remoteRepository |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| protocol Repository { | |
| func queryTasks (_ page: Int, completion: @escaping ([Task], NSError?) -> Void) | |
| func queryTasksInDay (_ day: Date) -> [Task] | |
| func queryTasksInDay (_ day: Date, completion: @escaping ([Task], NSError?) -> Void) | |
| func queryUnsyncedTasks() -> [Task] | |
| func queryDeletedTasks (_ completion: @escaping ([Task]) -> Void) | |
| func queryUpdates (sinceDate: Date, completion: @escaping ([Task], [String], NSError?) -> Void) | |
| // Marks the Task as deleted. If forceDelete is true it will be removed from db | |
| func deleteTask (_ task: Task, forceDelete: Bool, completion: @escaping ((_ success: Bool) -> Void)) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| func post (tweetString: String, tweetImage: NSData) { | |
| let uploadUrl = NSURL(string: "https://upload.twitter.com/1.1/media/upload.json") | |
| let uploadRequest = NSMutableURLRequest(URL: uploadUrl!) | |
| uploadRequest.HTTPMethod = "POST" | |
| let stringBoundary = "---------------------------14737809831466499882746641449" | |
| let contentType = "multipart/form-data; boundary=\(stringBoundary)" | |
| uploadRequest.addValue(contentType, forHTTPHeaderField:"Content-Type") |