Swiftpack.co - sobri909/CloudKitQueues as Swift Package

Swiftpack.co is a collection of thousands of indexed Swift packages. Search packages.
See all packages published by sobri909.
sobri909/CloudKitQueues 0.0.3
A queue manager for simplifying individual and batch operations on CloudKit records
⭐️ 11
🕓 2 years ago
iOS macOS
.package(url: "https://github.com/sobri909/CloudKitQueues.git", from: "0.0.3")

CloudKitQueues

A queue manager for simplifying both individual and batch operations on CloudKit records.

Seamless Individual and Batch Operations

CloudKitQueues provides methods for performing fetch, save, and delete actions on individual CKRecords and CKRecordIDs. The actions are then intelligently batched together, to get the fastest results in the least amount of CloudKit requests.

This makes it possible to get the best possible performance out of CloudKit, with the minimum number of requests within CloudKit's request limits.

No Manual Queue Management Required

With CloudKitQueues you no longer need to manage batch CloudKit operations in your loops, nor manage failures or retries on batch operations. Simply call fetch(), save(), delete() on individual CKRecords and CKRecordIDs, and CloudKitQueues will ensure that they are batched together in the most efficient manner.

The same methods are suitable both for single standalone operations and large batch operations. CloudKitQueues will ensure that the they are performed optimally in all cases.

Individual Completion Closures

Every fetch, save, and delete request takes an optional completion closure, which will be executed once the record's database action has completed. This allows the batching of hundreds of concurrent database operations together, while being able to easily perform completion actions on each record individually.

queue.fetch(ckRecordId) { ckRecord, error in
    if let ckRecord = ckRecord {
        print("ckRecord: " + ckRecord)
    }
}

Automatic Rate Limit Management

CloudKitQueues observes and respects CloudKit's rate limit timeouts, and automatically retries once the timeouts permit.

Fast and Slow Queues

CloudKitQueues manages two sets of queues:

  • Fast Queue: For fast operations, eg actions for which the user is waiting to see the result in the UI.
  • Slow Queue: For slow operations, eg backups, restores, and deletes that the user is not expecting to see the immediate results of.

When fetching a record you can choose to either queue.fetch(ckRecordId) or queue.slowFetch(ckRecordId).

When saving changes to a record you can choose to either queue.save(ckRecord) or queue.slowSave(ckRecord).

When deleting a record you can choose to either queue.delete(ckRecordId) or queue.slowDelete(ckRecordId).

CloudKitQueues manages these queues internally so that "fast" actions are batched together and performed as quickly as possible, and "slow" actions are batched together and performed when CloudKit determines that the energy and network conditions best suit.

Setup

pod 'CloudKitQueues'

Or just drop CloudKitQueue.swift into your project.

Examples

let publicQueue = CloudKitQueue(for: CKContainer.default().publicCloudDatabase)
let privateQueue = CloudKitQueue(for: CKContainer.default().privateCloudDatabase)

Fast Queue Actions

Note that all save(), fetch(), and delete() methods accept optional completion closures.

// save the CKRecords for all cars
for car in cars { 
    publicQueue.save(car.ckRecord) 
}
// fetch the CKRecords for all cars, and assign the fetched records
// to their car objects on fetch completion
for car in cars { 
    publicQueue.fetch(car.ckRecordId) { ckRecord, error in
        car.ckRecord = ckRecord
    }
}
// delete the remote CKRecords for all cars
for car in cars { 
    publicQueue.delete(car.ckRecordId)
}

Slow Queue Actions

// slow save the CKRecords for all cars
for car in cars { 
    publicQueue.slowSave(car.ckRecord) 
}
// slow fetch the CKRecords for all cars, and assign the fetched records
// to their car objects on fetch completion
for car in cars { 
    publicQueue.slowFetch(car.ckRecordId) { ckRecord, error in
        car.ckRecord = ckRecord
    }
}
// slow delete the remote CKRecords for all cars
for car in cars { 
    publicQueue.slowDelete(car.ckRecordId)
}

GitHub

link
Stars: 11
Last commit: 2 years ago
Advertisement: IndiePitcher.com - Cold Email Software for Startups

Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics