我是 Realm
的新手,我发现它非常有趣并且已经设法保存和检索数据。在我保存的数据中,我还保存了一个 NSDate()
,这样我就可以使用逻辑 LIFO
对结果进行排序,这意味着最后保存的应该最先到 TableView 。这是我的代码!
override func viewDidLoad() {
super.viewDidLoad()
let realmaki = try! Realm()
var eventodos = realmaki.objects(eventsNewSaved2)
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 288.0
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let realm = try! Realm()
let eventodoscount = realm.objects(eventsNewSaved2).sorted("realmgettime", ascending: true).count
return eventodoscount
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("savedCell", forIndexPath: indexPath) as! locationEventsTableViewCell
let realm = try! Realm()
let eventakiaSaved = realm.objects(eventsNewSaved2)
eventakiaSaved.sorted("realmgettime", ascending: true)
let task = eventakiaSaved[indexPath.row] as eventsNewSaved2
cell.eventTitle?.text = "\(task.realmtitle)"
cell.eventDate.text = "\(task.realmdate)"
cell.eventAttends.text = "\(task.realmattends)"
let imageDef : UIImage = UIImage(named: "noimage")!
if task.realmeventCover == "No Image Available" {
cell.eventImage.image = imageDef
} else {
let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
let realm = try! Realm()
let eventakiaSaved = realm.objects(eventsNewSaved2)
eventakiaSaved.sorted("realmgettime", ascending: true)
let task = eventakiaSaved[indexPath.row] as eventsNewSaved2
let url = NSURL(string: task.realmeventCover)
if url != nil {
let data = NSData(contentsOfURL: url!)
dispatch_async(dispatch_get_main_queue()) {
cell.eventImage.image = UIImage(data: data!)
}
} else {
cell.eventImage.image = imageDef
}
}
}
return cell
}
变量 realmgettime
是当用户在另一个 View 中按下保存按钮时我保存的日期时间对象。
即使我将升序设置为 true 或 false, TableView 也保持不变。
知道为什么不吗??
最佳答案
sorted(_:, ascending:)
不修改 Results<T>
.您尝试对 tableView(tableView:, cellForRowAtIndexPath:)
中的结果进行排序,但这样做没有意义。因为你忽略了返回值。
let eventakiaSaved = realm.objects(eventsNewSaved2)
eventakiaSaved.sorted("realmgettime", ascending: true)
上面的代码应该是这样的:
var eventakiaSaved = realm.objects(eventsNewSaved2)
var eventakiaSaved = eventakiaSaved.sorted("realmgettime", ascending: true)
更好的方法是链接方法。
let eventakiaSaved = realm.objects(eventsNewSaved2)
.sorted("realmgettime", ascending: true)
此外,Results
实例是实时的、自动更新底层数据的 View ,这意味着永远不必重新获取结果。
https://realm.io/docs/swift/latest/#auto-updating-results
所以你不需要每次都为同一个查询重新获取。保留一次结果,只要在同一个线程中,就可以在任何地方使用它。 推荐的方式如下:
...
var eventodos: Results<eventsNewSaved2>? // Keep results as a model
...
override func viewDidLoad() {
super.viewDidLoad()
let realm = try! Realm()
eventodos = realm
.objects(eventsNewSaved2)
.sorted("realmgettime", ascending: true) // Query only once
}
...
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return eventodoscount?.count ?? 0
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("savedCell", forIndexPath: indexPath) as! locationEventsTableViewCell
let task = eventodos[indexPath.row]
cell.eventTitle?.text = "\(task.realmtitle)"
cell.eventDate.text = "\(task.realmdate)"
cell.eventAttends.text = "\(task.realmattends)"
let imageDef : UIImage = UIImage(named: "noimage")!
if task.realmeventCover == "No Image Available" {
cell.eventImage.image = imageDef
} else {
let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
let realm = try! Realm()
// Need re-fetch because this within sub-thread
let eventakiaSaved = realm
.objects(eventsNewSaved2)
.eventakiaSaved.sorted("realmgettime", ascending: true)
let task = eventakiaSaved[indexPath.row]
let url = NSURL(string: task.realmeventCover)
if url != nil {
let data = NSData(contentsOfURL: url!)
dispatch_async(dispatch_get_main_queue()) {
cell.eventImage.image = UIImage(data: data!)
}
} else {
cell.eventImage.image = imageDef
}
}
}
return cell
}
关于ios - 按日期升序的 Realm 顺序总是失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38546783/