pushpanjalip / iCloudSyncDataWithCoreData

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

iCloud + Sync +Core Data https://www.youtube.com/watch?v=SG_XSD84WOc https://www.youtube.com/channel/UCysEngjfeIYapEER9K8aikw

iCloudSyncDataWithCoreDataiCloud Storage

• Create an App Id: Go to your developer center. Click on identifiers->AppId Give name and bundle identifier Enable iCloud for app id Go to edit and tick on icloud compability Again click on edit in front of iCloud Choose container for your app In your Xcode project Go to Capabilities->enable iCloud Check iCloud Documents Use default Container and you can see the container below

When we enable iCloud in Xcode it will automatically create projname.entitlement file in your project • Create SingleView Application with Core Data Create subclass of NSObject “CoreDataHelper”

class CoreDataHelper: NSObject {

class func insertManagedObject(className:String,managedObjectContext:NSManagedObjectContext) -> AnyObject
{

    let managedObject = NSEntityDescription.insertNewObjectForEntityForName(className, inManagedObjectContext: managedObjectContext) as NSManagedObject
    return managedObject

}
class func fetchEntities(className:String,managedObjectContext:NSManagedObjectContext,predicate:NSPredicate?)->NSArray
{

    let fetchRequest=NSFetchRequest()
    let entityDecsription=NSEntityDescription.entityForName(className, inManagedObjectContext: managedObjectContext)
    fetchRequest.entity=entityDecsription
    if predicate != nil
    {
      fetchRequest.predicate=predicate!
    }
    
    fetchRequest.returnsObjectsAsFaults=false
    var items:NSArray=[]
    
    do {
        items = try managedObjectContext.executeFetchRequest(fetchRequest)
        // success ...
    } catch let error as NSError {
        // failure
        print("Fetch failed: \(error.localizedDescription)")
    }
    
    return items
    

}

}

• Create Data models in projname.xcdatamodeld Create NSManagedObject classes which we’ll be use to access these data models Select both entities and click on editor-> create NSManagedObject subclass You can choose language for these subclasses If you choose objective-c then create bridgim=ng header and import Note.h and Notebook.h

• Open AppDelegate.swift and make changes

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {

    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
    
    /*For iCloud*/
    
    let documentDirectory=NSFileManager.defaultManager().URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask).last! as NSURL
    let storeURL=documentDirectory.URLByAppendingPathComponent("CoreData.sqlite")  //file for coreData database
    
    let storeOptions = [NSPersistentStoreUbiquitousContentNameKey:"CloudNoteStore"]  //provides iCloud capability
    
    
    var failureReason = "There was an error creating or loading the application's saved data."
    do {
        try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: storeOptions)
    } catch {
        // Report any error we got.
        var dict = [String: AnyObject]()
        dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"
        dict[NSLocalizedFailureReasonErrorKey] = failureReason

        dict[NSUnderlyingErrorKey] = error as NSError
        let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)

be useful during development. NSLog("Unresolved error (wrappedError), (wrappedError.userInfo)") abort() }

    return coordinator
}()

lazy var managedObjectContext: NSManagedObjectContext = {

let coordinator = self.persistentStoreCoordinator var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType) managedObjectContext.persistentStoreCoordinator = coordinator return managedObjectContext }() //Changes highlighted in red

• In TableViewController.swift Create variables var moc:NSManagedObjectContext! var notebookArray=Notebook

override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) if let context = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext { moc=context

    }
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(NotebookTableViewController.persistentStoreDidChange), name: NSPersistentStoreCoordinatorStoresDidChangeNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(NotebookTableViewController.persistentWillChange(_:)), name: NSPersistentStoreCoordinatorStoresWillChangeNotification, object: moc.persistentStoreCoordinator)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(NotebookTableViewController.receiveICloudChange(_:)), name: NSPersistentStoreDidImportUbiquitousContentChangesNotification, object: moc.persistentStoreCoordinator)
}

override func viewWillDisappear(animated: Bool) { NSNotificationCenter.defaultCenter().removeObserver(self, name: NSPersistentStoreCoordinatorStoresDidChangeNotification, object: nil) NSNotificationCenter.defaultCenter().removeObserver(self, name: NSPersistentStoreCoordinatorStoresWillChangeNotification, object: moc.persistentStoreCoordinator) NSNotificationCenter.defaultCenter().removeObserver(self, name: NSPersistentStoreDidImportUbiquitousContentChangesNotification, object: moc.persistentStoreCoordinator)

}

func persistentStoreDidChange() { //Re-Enable UI and Fetch Data self.navigationItem.title="iCloud Ready" self.navigationItem.rightBarButtonItem?.enabled=true self.loadData() } func persistentWillChange(notification:NSNotification) { self.navigationItem.title="Changes In Progress"

    //Disable UI
    self.navigationItem.rightBarButtonItem?.enabled=false
    moc.performBlock{() -> Void in
        if self.moc.hasChanges
        {
            do {
                try self.moc.save()
            } catch let error as NSError {
                
                NSLog("Unresolved error \(error), \(error.userInfo)")
                // Handle Error
            }
            
            //drop any managed object
            self.moc.reset()
         }
    }

}
func receiveICloudChange(notification:NSNotification)
{
    moc.performBlock{() -> Void in
    self.moc.mergeChangesFromContextDidSaveNotification(notification)
        self.loadData()
    }
}

About


Languages

Language:Swift 86.3%Language:Objective-C 13.7%