2016-10-01 9 views
1

я модернизировал свой AppDelegate от этогоКак сделать функциональные возможности будут доступны для прошивки больше 8 с AppDelegate обновления

// MARK: - Core Data stack 

    lazy var applicationDocumentsDirectory: URL = { 
     let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) 
     return urls[urls.count-1] 
    }() 

    lazy var managedObjectModel: NSManagedObjectModel = { 
     let modelURL = Bundle.main.url(forResource: "TestProject", withExtension: "momd")! 
     return NSManagedObjectModel(contentsOf: modelURL)! 
    }() 

    lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = { 

     // Create the coordinator and store 
     let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) 
     let url = self.applicationDocumentsDirectory.appendingPathComponent("SingleViewCoreData.sqlite") 
     var failureReason = "There was an error creating or loading the application's saved data." 
     do { 
      try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: nil) 
     } catch { 
      // Report any error we got. 
      var dict = [String: AnyObject]() 
      dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" as AnyObject? 
      dict[NSLocalizedFailureReasonErrorKey] = failureReason as AnyObject? 

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

      NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)") 
      abort() 
     } 

     return coordinator 
    }() 

    lazy var managedObjectContext: NSManagedObjectContext = { 
     // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail. 
     let coordinator = self.persistentStoreCoordinator 
     var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) 
     managedObjectContext.persistentStoreCoordinator = coordinator 
     return managedObjectContext 
    }() 

    // MARK: - Core Data Saving support 

    func saveContext() { 
     if managedObjectContext.hasChanges { 
      do { 
       try managedObjectContext.save() 
      } catch { 
       // Replace this implementation with code to handle the error appropriately. 
       // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
       let nserror = error as NSError 
       NSLog("Unresolved error \(nserror), \(nserror.userInfo)") 
       abort() 
      } 
     } 
    } 

к этому, так что я могу использовать IOS 10 для кодирования основных данных с Swift 3

// MARK: - Core Data stack 

    @available(iOS 10.0, *) 
    lazy var persistentContainer: NSPersistentContainer = { 

     let container = NSPersistentContainer(name: "TestProject") 
     container.loadPersistentStores(completionHandler: { (storeDescription, error) in 
      if let error = error as NSError? { 

       fatalError("Unresolved error \(error), \(error.userInfo)") 
      } 
     }) 
     return container 
    }() 

    // MARK: - Core Data Saving support 

    @available(iOS 10.0, *) 
    func saveContext() { 
     let context = persistentContainer.viewContext 
     if context.hasChanges { 
      do { 
       try context.save() 
      } catch { 
       // Replace this implementation with code to handle the error appropriately. 
       // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
       let nserror = error as NSError 
       fatalError("Unresolved error \(nserror), \(nserror.userInfo)") 
      } 
     } 
    } 

Но когда я кодирование в контроллере представления, я получаю эти доступен для прошивки 10,0

@IBAction func saveBtnPressed(_ sender: AnyObject) { 

     if #available(iOS 10.0, *) { 
      let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 

      let task = Task(context: context) 
      task.taskDesc = goalText.text! 
      task.taskImage = UIImagePNGRepresentation(choosenImage!)! as NSData? 

     } else { 
      // Fallback on earlier versions 
     } 
     //Save the data to coredata 
     (UIApplication.shared.delegate as! AppDelegate).saveContext() 
    } 

В любом случае, я могу использовать iOS 10 с синтаксисом SWIFT 3 и сделать функциональность доступной для всех устройств, использующих iOS 8 и более. Заранее спасибо

ответ

1

Да, вы можете отправить Swift 3 код на iOSv8. Вот пример использования Swift v2.3 (v2.3 против v3.0 является неважным различие обнаружения рамки признака):

convenience init(moc: NSManagedObjectContext) { 
    if #available(iOS 10.0, *) { 
     self.init(context: moc) 
    } 
    else { 
     let name = NSStringFromClass(self.dynamicType) 
     let entityName = name.componentsSeparatedByString(".").last! 
     let entity = NSEntityDescription.entityForName(entityName, inManagedObjectContext: moc)! 
     self.init(entity: entity, insertIntoManagedObjectContext: moc) 
    } 
} 

Реальный вопрос, который вы должны спросить себя, почему вы обнявшись Core Data предлагается вперед ваших клиентов?