- Notifications
You must be signed in to change notification settings - Fork64
Seamless CloudKit Sync with CoreData
License
nofelmahmood/Seam
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Seam allows you to sync your CoreData Stores with CloudKit.
- Automatic mapping of CoreData Models to CloudKit Private Databases
- Supports Assets
- Background Sync
- Conflict Resolution
- iOS 8.0+ / Mac OS X 10.10+
- Xcode 7.1+
- If you want to contribute submit apull request.
- If your app uses Seam I'll be glad to add it to the list. Edit theList and submit apull request.
- If you found a bugopen an issue.
- If you have a feature requestopen an issue.
- If you have a question, ask it onStack Overflow.
Please read theContributing Guidelines before doing any of above.
CocoaPods is a dependency manager for Cocoa projects. You can install it with the following command:
$ gem install cocoapods
To integrate Seam into your Xcode project using CocoaPods, specify it in yourPodfile
:
source'https://github.com/CocoaPods/Specs.git'platform:ios,'8.0'use_frameworks!pod'Seam','~> 0.6'
Then, run the following command:
$ pod install
Carthage is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.
You can install Carthage withHomebrew using the following command:
$ brew update$ brew install carthage
To integrate Seam into your Xcode project using Carthage, specify it in yourCartfile
:
github "Seam/Seam" ~> 0.6
Runcarthage update
to build the framework and drag the builtSeam.framework
into your Xcode project.
Add a Store type ofSeamStoreType
to a NSPersistentStoreCoordinator in your CoreData stack:
letpersistentStoreCoordinator=NSPersistentStoreCoordinator(managedObjectModel: yourModel)letseamStore=try persistentStoreCoordinator.addPersistentStoreWithType(SeamStoreType, configuration:nil, URL: url, options:nil)as?Store
Observe the following two Notifications to know when the Sync Operation starts and finishes:
NSNotificationCenter.defaultCenter().addObserver(self, selector:"didStartSyncing:", name: SMStoreDidStartSyncingNotification, object: seamStore)NSNotificationCenter.defaultCenter().addObserver(self, selector:"didFinishSyncing:", name: SMStoreDidFinishSyncingNotification, object: seamStore)func didStartSyncing(notification:NSNotification){ // Prepare for new data before syncing completes}func didFinishSyncing(notification:NSNotification){ // Merge Changes into your context after syncing completes mainContext.mergeChangesFromStoreDidFinishSyncingNotification(notification)}
Finally call sync whenever and wherever you want:
seamStore.sync(nil)
To trigger sync whenever a change happens on the CloudKit Servers. Subscribe the store to receive Push Notifications from the CloudKit Servers.
seamStore.subscribeToPushNotifications({ successfulinguard successfulelse{return} // Ensured that subscription was created successfully})// In your AppDelegatefunc application(application:UIApplication, didReceiveRemoteNotification userInfo:[NSObject:AnyObject]){ seamStore.sync(nil)}
All CloudKit Attributes are mapped automatically to your CoreData attributes with the exception ofCKAsset andCLLocation.
CKAsset and CLLocation can be used by setting the corresponding attribute as Transformable in your CoreData Model.
CloudKit | CoreData |
---|---|
NSDate | NSDate |
NSData | NSData |
NSString | NSString |
NSNumber | NSNumber |
CKReference | NSManagedObject |
CKAsset | Transformable |
CLLocation | Transformable |
CKAsset and CLLocation can be used in your CoreData model as Transformable attributes.
- To useCKAsset setTransformable as AttributeType andCKAssetTransformer as value transformer name for the attribute.
- To useCLLocation setTransformable as AttributeType andCLLocationTransformer as value transformer name for the attribute.
CoreData Relationship | Translation on CloudKit |
---|---|
To - one | To one relationships are translated as CKReferences on the CloudKit Servers. |
To - many | To many relationships are not explicitly created. Seam only creates and manages to-one relationships on the CloudKit Servers. Example -> If an Employee has a to-one relationship to Department and Department has a to-many relationship to Employee than Seam will only create the former on the CloudKit Servers. It will fullfil the later by using the to-one relationship. If all employees of a department are accessed Seam will fulfil it by fetching all the employees that belong to that particular department. |
Note : You must create inverse relationships in your app's CoreData Model or Seam wouldn't be able to translate CoreData Models in to CloudKit Records. Unexpected errors and curroption of data can possibly occur.
Download the demo project. Run it and see the magic as it happens.
tvOS provides no persistent local storage. Seam uses SQLITE file to keep a local copy of your database which is not possible with tvOS.
Alist of Apps which are usingSeam.
Seam is owned and maintained byNofel Mahmood.
You can follow him onTwitter andMedium
Seam is available under the MIT license. See theLICENSE file for more info.
About
Seamless CloudKit Sync with CoreData