如何在Realm数组中的特定索引处插入对象



我根据Realm提供的GroupedTableView示例构建了我的2D阵列数据模型。然而,我正在尝试实现对tasksByPriority数组中的任务进行重新排序的功能,并且不确定如何在特定数组中进行插入。目前,Realm Results数组正在按dateCreated排序,我只知道如何在Realm对象的末尾向Realm添加新任务,而不知道如何在特定索引处添加。

import UIKit
import MGSwipeTableCell
import RealmSwift
import Realm
import AEAccordion
class TasksTableViewController: UITableViewController {
    var realm: Realm!
    var notificationToken: NotificationToken?
    var priorityIndexes = [0, 1, 2, 3]
    var priorityTitles = ["Urgent | Important", "Urgent | Not Important", "Not Urgent | Important", "Not Urgent | Not       Important"]
    var tasksByPriority = [Results<Task>]()
    override func viewDidLoad() {
        super.viewDidLoad()
        realm = try! Realm()
        notificationToken = realm.addNotificationBlock { [unowned self] note, realm in
            self.tableView.reloadData()
        }
        for priority in priorityIndexes {
            let unsortedObjects = realm.objects(Task.self).filter("priorityIndex == (priority)")
            let sortedObjects = unsortedObjects.sorted("dateCreated", ascending: true)
            tasksByPriority.append(sortedObjects)
        }
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return priorityIndexes.count
    }
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return Int(tasksByPriority[section].count)
    }

    override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return priorityTitles[section]
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("taskTableViewCell", forIndexPath: indexPath) as! TaskTableViewCell
        // Configure the cell...
        let task = self.taskForIndexPath(indexPath)
            //configure right buttons
        cell.rightButtons = [MGSwipeButton(title: "", icon: UIImage(named:"deleteTask.png"), backgroundColor: UIColor(red: 0, green: 0, blue: 0, alpha: 0), callback: {
                (sender: MGSwipeTableCell!) -> Bool in
                RealmHelper.deleteTask(self.taskForIndexPath(indexPath)!)
                return true
        })]
         return cell
    }
    func taskForIndexPath(indexPath: NSIndexPath) -> Task? {
        return tasksByPriority[indexPath.section][indexPath.row]
    }

    // MARK: Segues
    @IBAction func unwindToTasksTableViewController(sender: UIStoryboardSegue) {
        if let sourceViewController = sender.sourceViewController as? DisplayTaskViewController, task = sourceViewController.task, priorityIndex = sourceViewController.priorityIndex {
            if let selectedIndexPath = tableView.indexPathForSelectedRow {
                // Update an existing task.
                if selectedIndexPath.section == priorityIndex { // not changing priority
                    RealmHelper.updateTask(taskForIndexPath(selectedIndexPath)!, newTask: task)
                }
                else { // changing priority
                    RealmHelper.addTask(task)
                    RealmHelper.deleteTask(taskForIndexPath(selectedIndexPath)!)
                }
            }
            else {
                RealmHelper.addTask(task)
            }
        }
    }
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let identifier = segue.identifier {
            if identifier == "editTaskDetailsSegue" {
                let displayTaskViewController = segue.destinationViewController as! DisplayTaskViewController
                // set task of DisplayTaskViewController to task tapped on
                if let selectedTaskCell = sender as? TaskTableViewCell {
                    let indexPath = tableView.indexPathForCell(selectedTaskCell)!
                    let selectedTask = taskForIndexPath(indexPath)
                    displayTaskViewController.task = selectedTask
                    print("Task completed: (selectedTask!.completed)")
                    displayTaskViewController.priorityIndex = indexPath.section
                    displayTaskViewController.completed = (selectedTask?.completed)!
                }
            }
            else if identifier == "addNewTaskSegue" {
            }
        }
    }
}

Realm助手类

import Foundation
import RealmSwift
class RealmHelper {
static func addTask(task: Task) {
    let realm = try! Realm()
    try! realm.write() {
        realm.add(task)
    }
}

static func deleteTask(task: Task) {
    let realm = try! Realm()
    try! realm.write() {
        realm.delete(task)
    }
}
static func updateTask(taskToBeUpdated: Task, newTask: Task) {
    let realm = try! Realm()
    try! realm.write() {
        taskToBeUpdated.text = newTask.text
        taskToBeUpdated.details = newTask.details
        taskToBeUpdated.dueDate = newTask.dueDate
        taskToBeUpdated.completed = newTask.completed
    }
}
}

TL;DR

境界中的物体是无序的。如果确实要对对象进行排序,可以使用List<T>类型。一个List可以突变,你可以insert(_:atIndex:)removeAtIndex(_:)等等。这是列表类参考,你可以在那里找到如何使用它。

最新更新