Skip to content

Instantly share code, notes, and snippets.

View cristibaluta's full-sized avatar

Cristian Baluta cristibaluta

View GitHub Profile
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)
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)
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)
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 {
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 {
class CloudKitRepository {
internal let privateDB = CKContainer.default().privateCloudDatabase
internal let customZone = CKRecordZone(zoneName: "TasksZone")
init() {
privateDB.save(customZone) { (recordZone, err) in
}
}
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
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))
@cristibaluta
cristibaluta / menu.swift
Last active February 4, 2017 08:12
Create status bar icon menu in swift
let bar = NSStatusBar.system()
let length: CGFloat = -1 //NSVariableStatusItemLength
var item = bar.statusItem(withLength: length)
item?.button?.image = NSImage(named: "MenuBarIcon-Normal")!
item?.button?.alternateImage = NSImage(named: "MenuBarIcon-Selected")!
let menu = NSMenu()
menu.addItem(NSMenuItem(title: "Blinkk \(appVersion)", action: nil, keyEquivalent: ""))
menu.addItem(NSMenuItem.separator())
@cristibaluta
cristibaluta / PostToTwitterTwitter.swift
Created November 25, 2015 07:30
Post image to twitter using only Parse for authentication and NSURLConnection
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")