This file contains 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 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 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 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 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 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 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 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 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") |