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

时间:2016-07-25 23:25:55

标签: ios arrays swift tableview 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 Helper Class

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
    }
}
}

1 个答案:

答案 0 :(得分:2)

<强> TL; DR

Realm中的对象是无序的。如果您确实要对对象进行排序,可以使用List<T>类型。 List可以变异,您可以insert(_:atIndex:)removeAtIndex(_:)等等。这是List Class Reference,您可以在其中找到如何使用它。