Skip to content

Commit

Permalink
Fix realm write crash when creating object in parseFromRecord
Browse files Browse the repository at this point in the history
  • Loading branch information
caiyue1993 committed Feb 8, 2021
1 parent 10609d2 commit c1a7ae0
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 13 deletions.
15 changes: 11 additions & 4 deletions Example/IceCream_Example/OwnersViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -76,21 +76,28 @@ extension OwnersViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
guard indexPath.row < owners.count else { return }
let owner = owners[indexPath.row]
let viewController = OwnerDetailViewController(cats: Array(owner.cats))
let viewController = OwnerDetailViewController(cats: Array(owner.cats).filter { !$0.isDeleted })
navigationController?.pushViewController(viewController, animated: true)
}

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
let addAction = UITableViewRowAction(style: .default, title: "Add cat") { (_, ip) in
let addCatAction = UITableViewRowAction(style: .default, title: "Add cat") { (_, ip) in
guard ip.row < self.owners.count else { return }
let owner = self.owners[ip.row]
let newCat = Cat()
newCat.name = "Cat No.\(owner.cats.count)"
newCat.name = "\(owner.name)'s No.\(owner.cats.count + 1) cat"
newCat.age = ip.row
try! self.realm.write {
owner.cats.append(newCat)
}
}
let deleteCatAction = UITableViewRowAction(style: .default, title: "Delete cat") { (_, ip) in
guard ip.row < self.owners.count else { return }
let owner = self.owners[ip.row]
try! self.realm.write {
owner.cats.last?.isDeleted = true
}
}
let deleteAction = UITableViewRowAction(style: .destructive, title: "Delete") { (_, ip) in
let alert = UIAlertController(title: NSLocalizedString("caution", comment: "caution"), message: NSLocalizedString("sure_to_delete", comment: "sure_to_delete"), preferredStyle: .alert)
let deleteAction = UIAlertAction(title: NSLocalizedString("delete", comment: "delete"), style: .destructive, handler: { (action) in
Expand All @@ -105,7 +112,7 @@ extension OwnersViewController: UITableViewDelegate {
alert.addAction(deleteAction)
self.present(alert, animated: true, completion: nil)
}
return [addAction, deleteAction]
return [addCatAction, deleteCatAction, deleteAction]
}
}

Expand Down
6 changes: 3 additions & 3 deletions IceCream/Classes/CKRecordConvertible.swift
Original file line number Diff line number Diff line change
Expand Up @@ -121,15 +121,15 @@ extension CKRecordConvertible where Self: Object {
var referenceArray = [CKRecord.Reference]()
let wrappedArray = list._rlmArray
for index in 0..<wrappedArray.count {
guard let object = wrappedArray[index] as? Object , let primaryKey = object.objectSchema.primaryKeyProperty?.name else { continue }
guard let object = wrappedArray[index] as? Object, let primaryKey = object.objectSchema.primaryKeyProperty?.name else { continue }
switch object.objectSchema.primaryKeyProperty?.type {
case .string:
if let primaryValueString = object[primaryKey] as? String {
if let primaryValueString = object[primaryKey] as? String, let obj = object as? CKRecordConvertible, !obj.isDeleted {
let referenceZoneID = CKRecordZone.ID(zoneName: "\(object.objectSchema.className)sZone", ownerName: CKCurrentUserDefaultName)
referenceArray.append(CKRecord.Reference(recordID: CKRecord.ID(recordName: primaryValueString, zoneID: referenceZoneID), action: .none))
}
case .int:
if let primaryValueInt = object[primaryKey] as? Int {
if let primaryValueInt = object[primaryKey] as? Int, let obj = object as? CKRecordConvertible, !obj.isDeleted {
let referenceZoneID = CKRecordZone.ID(zoneName: "\(object.objectSchema.className)sZone", ownerName: CKCurrentUserDefaultName)
referenceArray.append(CKRecord.Reference(recordID: CKRecord.ID(recordName: "\(primaryValueInt)", zoneID: referenceZoneID), action: .none))
}
Expand Down
18 changes: 12 additions & 6 deletions IceCream/Classes/CKRecordRecoverable.swift
Original file line number Diff line number Diff line change
Expand Up @@ -76,26 +76,32 @@ extension CKRecordRecoverable where Self: Object {
if let existObject = realm.object(ofType: uListType, forPrimaryKey: primaryKeyValue) {
uList.append(existObject)
} else {
let object = realm.create(uListType)
uList.append(object)
try! realm.write {
let object = realm.create(uListType)
uList.append(object)
}
}
}

if schema.className == vListType.className() {
if let existObject = realm.object(ofType: vListType, forPrimaryKey: primaryKeyValue) {
vList.append(existObject)
} else {
let object = realm.create(vListType)
vList.append(object)
try! realm.write {
let object = realm.create(vListType)
vList.append(object)
}
}
}

if schema.className == wListType.className() {
if let existObject = realm.object(ofType: wListType, forPrimaryKey: primaryKeyValue) {
wList.append(existObject)
} else {
let object = realm.create(wListType)
wList.append(object)
try! realm.write {
let object = realm.create(wListType)
wList.append(object)
}
}
}

Expand Down

0 comments on commit c1a7ae0

Please sign in to comment.