Switch之iCloud的配置和使用(二)

CKDatabase的简单使用

let database = CKContainer.default().publicCloudDatabase
//CKContainer: Containers 就像应用运行的沙盒一样,一个应用只能访问自己沙盒中的内容而不能访问其他应用的
override func viewDidLoad() {
    super.viewDidLoad()
    
    let volvo = CKRecord.init(recordType: "person1")
    volvo.setObject("liu" as __CKRecordObjCValue, forKey: "name")
    volvo.setObject(18 as __CKRecordObjCValue, forKey: "age")
    volvo.setObject(false as __CKRecordObjCValue, forKey: "isMan")
    
    database.save(volvo) { (record, error) in
        if error == nil{
            print("成功  \(record?.object(forKey: "name"))")
        }else{
            print("失败")
        }
    }
}

 Demo,创建区域记录

class ViewController: UIViewController{
    
    
    let database = CKContainer.default().privateCloudDatabase
    enum CarType:String{
        case Hatckback = "Hatckback"
        case Estate = "Estate"
        func zoneId()->CKRecordZone.ID{
//            CKOwnerDefaultName
            let zoneID = CKRecordZone.ID.init(zoneName: self.rawValue, ownerName:      CKRecordZone.ID.defaultZoneName)
            return zoneID
        }
        func zone() -> CKRecordZone{
            
            
            return CKRecordZone.init(zoneID: self.zoneId())
        }
    }
    //生成一个区域的记录
    func carWithType(type:CarType)->CKRecord{
        let uuid = NSUUID().uuidString//随机成功一个标识符,随便起名字,不需要使用uuid
        let recordId = CKRecord.ID.init(recordName: uuid, zoneID: type.zoneId())//生成区域的名字
        let car = CKRecord.init(recordType: "MyCar", recordID: recordId)//MyCar想要一个名菜MyCar的模式
        return car
        
    }
    //给记录赋值
    func carWithType(type: CarType, maker: String, model: String, numberOfDoors: Int, year: Int) -> CKRecord{
        let record = carWithType(type: type);//生成记录
        record.setValue(maker, forKey: "maker");//给记录复制
        record.setValue(model, forKey: "model");
        record.setValue(numberOfDoors, forKey: "numberOfDoors");
        record.setValue(year, forKey: "year");
        return record
    }
    //返回一个区域的赋值记录
    func hatchbackCarWithMaker(maker: String,model: String,numberOfDoors: Int, year: Int) -> CKRecord{
        return carWithType(type: .Hatckback,  maker: maker,  model: model,  numberOfDoors: numberOfDoors, year: year)
    }
    func estateCarWithMaker(maker: String, model: String, numberOfDoors: Int, year: Int) -> CKRecord{
        return carWithType(type: .Estate, maker: maker, model: model, numberOfDoors: numberOfDoors,  year: year)
    }
    //
    func saveCarClosure(record: CKRecord! , error: CKError! ){
        /* 小心,可能在非UI线程中 */
        if error != nil{
//            error as! CKError
            print("Failed to save the car. Error = \(String(describing: error)) ::::\(String(describing: error.retryAfterSeconds))")
            
        }else{
            print("Successfully saved the car with type \(record.recordType)")
        }
    }
    //保存多条记录
    func saveCars(cars: [CKRecord]){
        for car in cars{
            database.save(car) {[weak self] (record, error) in
                self?.saveCarClosure(record: record, error: error as? CKError)
            }
            
        }
    }
    func saveEstateCars(){
        let volvoV50 = estateCarWithMaker(maker: "Volvo",  model: "V50",  numberOfDoors: 5,  year: 2016);
        let audiA6 = estateCarWithMaker(maker: "Audi",  model: "A6",  numberOfDoors: 5,  year: 2018);
        let skodaOctavia = estateCarWithMaker(maker: "Skoda",  model: "Octavia",  numberOfDoors: 5,  year: 2016);
        print("Saving estate cars...")
        saveCars(cars: [volvoV50, audiA6, skodaOctavia])
    }
    func saveHatchbackCars(){
        let fordFocus = hatchbackCarWithMaker(maker: "Formaker: d", model: "Focus", numberOfDoors: 6, year: 2018)
        print("Saving hatchback cars...")
        saveCars(cars: [fordFocus])
    }
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        //检查用户是否登录了iCloud账号
        if isIcloudAvailable() == false{
            print("iCloud is not available.")
            return
        }
        //使用fetchAllRecordZones插件用户私有数据库已经存在的数据,如果创建,则保存数据,如果为创建,则先创建区域
        database.fetchAllRecordZones {[weak self] (zones , error) in
            if error != nil{
                print("Could not retrieve the zones")
            }else {
                var foundEstateZone = false
                var foundHatchbackZone = false
                for zone in zones as! [CKRecordZone]{
                    if zone.zoneID.zoneName == CarType.Hatckback.rawValue{
                        foundHatchbackZone = true
                    } else if zone.zoneID.zoneName == CarType.Estate.rawValue{
                        foundEstateZone = true
                    }
                }
                self! .useOrSaveZone(zoneIsCreatedAlready: foundEstateZone, forCarType: .Estate)
//                self! .useOrSaveZone(zoneIsCreatedAlready: foundHatchbackZone, forCarType: .Hatckback)
            }
        }
        
    }
    //检查用户是否登录了iCloud账号
    func isIcloudAvailable() -> Bool{
        print(FileManager.default.ubiquityIdentityToken)
        if let token = FileManager.default.ubiquityIdentityToken{
            return true
        } else {
            return false
        }
    }
    func saveCarsForType(type: CarType){
        switch type{
        case .Hatckback:
            saveHatchbackCars()
        case .Estate:
            saveEstateCars()
        default:
            print("Unknown car state is given")
        }
    }
    //  zoneIsCreatedAlready区域是否存在
    func useOrSaveZone(zoneIsCreatedAlready: Bool, forCarType: CarType){
        if zoneIsCreatedAlready{
            print("Found the \(forCarType.rawValue) ,z,o,n,e. 
              It' s been created already")
            saveCarsForType(type: forCarType)
            
        } else {
    
            database.save(forCarType.zone()) {[weak self]  (zone, error) in
                if error != nil{
                    print("Could not save the hatchback zone.\(String(describing: error)) ")
                   
                }else{
                    print("Successfully saved the hatchback zon")
                    self?.saveCarsForType(type: forCarType)
                    
//                    print("Successfully saved the hatchback zon")
                }
            }
        }
        
    }

    
}

猜你喜欢

转载自www.cnblogs.com/hualuoshuijia/p/12048708.html