您可以从 Swift Docs 检查第一个对象是否存在:
public var first: T? { return rlmResults.firstObject() as! T? }
返回结果中的第一个对象,如果为空,则返回 nil。
来自 Java 的领域文档(在 Swift 文档中找不到相同的措辞):
请注意,即使在不包含任何对象的情况下,RealmResults 也永远不会为空。您应该始终使用 size() 方法来检查 RealmResults 是否为空。
长话短说,检查第一个对象是否存在或尝试计算元素。
资料来源:
Java - 类 RealmResults ,
Swift - 结果类参考
编辑:这是一个代码示例,它取自 Realm 示例并根据我的需要进行了修改,他们使用通知令牌来检测数组是否为空
class Record: Object {
dynamic var workoutName = ""
dynamic var totalTime = ""
dynamic var date = ""
}
let realm = try! Realm()
let array = try! Realm().objects(Record).sorted("date")
var notificationToken: NotificationToken?
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
// Set results notification block
notificationToken = array.addNotificationBlock { [weak self] (changes: RealmCollectionChange) in
guard let tableView = self?.tableView else { return }
switch changes {
case .Initial:
// Results are now populated and can be accessed without blocking the UI
tableView.reloadData()
break
case .Update(_, let deletions, let insertions, let modifications):
// Query results have changed, so apply them to the UITableView
tableView.beginUpdates()
tableView.insertRowsAtIndexPaths(insertions.map { NSIndexPath(forRow: $0, inSection: 0) },
withRowAnimation: .Automatic)
tableView.deleteRowsAtIndexPaths(deletions.map { NSIndexPath(forRow: $0, inSection: 0) },
withRowAnimation: .Automatic)
tableView.reloadRowsAtIndexPaths(modifications.map { NSIndexPath(forRow: $0, inSection: 0) },
withRowAnimation: .Automatic)
tableView.endUpdates()
break
case .Error(let error):
// An error occurred while opening the Realm file on the background worker thread
fatalError("\(error)")
break
}
}
}
我还使用 deleteAll() 清除表:
func clearTable() {
try! realm.write {
realm.deleteAll()
}
}