由于多次触发功能,如何避免在tableView上重复项?

时间:2015-07-28 13:17:41

标签: ios arrays swift duplicates

我的问题是我在viewDidLoad中查询元素并添加到tableView。在另一个视图中,用户可以向Parse添加元素,我在viewDidAppear上再次查询以仅显示新添加的元素而不需要视图重新加载。 这些元素是具有姓名,年龄等的用户类...

在viewDidAppear上,我正在查询Parse中的元素,通过一个混乱的过滤来找出那些尚未显示在tableView上的元素,然后我触发我的函数来添加它。

看来即使我从我的数组中删除了重复的项目,设置我的用户的功能(添加他的名字等)也被多次调用,因此我仍然在我的tableView上找到重复的项目。

相应的代码如下:

      override func viewWillAppear(animated: Bool) {


    var query = PFUser.query()

    query!.whereKey("username", equalTo: PFUser.currentUser()!.username!)


    query!.findObjectsInBackgroundWithBlock { (objects, NSError) -> Void in



        if let objects = objects as? [PFObject] {

            for member in objects {

                if member["Network"] != nil {

                    var acceptedMembers: [String] = member["Network"] as! [String]

                    self.usernames = acceptedMembers

                    ////

                    var query2 = PFUser.query()

                    query2?.findObjectsInBackgroundWithBlock({ (objects2, error2) -> Void in

                        if let objects2 = objects2 as? [PFUser] {

                            for otherUser in objects2 {

                                if contains(self.usernames, otherUser.username!) {


                                   var arrayName1 = [String]()

                                    arrayName1.append(otherUser.username!)

                                    var arrayName2 = [String]()

                                    for n in self.arrayMem {

                                     arrayName2.append(n.name)

                                     dispatch_async(dispatch_get_main_queue(), {

                                        for extra in arrayName1 {

                                            if contains(arrayName2, extra) {

                                            } else {

                                                var arrayName3 = [String]()

                                                arrayName3.append(extra)


                                               let unique3 = NSSet(array: arrayName3).allObjects

                                               self.plusOne = unique3.first as! String

                                                self.nameMember = self.plusOne as String

                                                self.setName()

                                                 self.tableView.reloadData()

                                             }
                                            }
                                          })
                                        }

                                   }}}})    }}}}
                               }
PS:我已经尝试过更清晰的解决方案来删除重复,将我的类转换为Hashable,然后将Equatable转换为使用简单的函数,但是它会发现这个解决方案更麻烦,因为它更有效。 无论如何,这里的问题涉及被重复调用的函数“self.setName()”。

你知道如何解决这个问题吗? 非常感谢你,

1 个答案:

答案 0 :(得分:0)

另一种方法是在将新对象添加到其他视图控制器中之后向其添加新对象,然后将新行添加到表视图中。我建议通过NSNotification传递新形成的对象。

使用表格查看控制器

从Parse获取对象,在viewDidLoad中执行一次

 InsecurePlatformWarning 
Staff:  ['@Craig_Tolliver', '@MarketsTicker', '@EnergyTicker', '@MWHealthBlog', '@KitchenNews', '@SueChangMW', '@MWMozee', '@jjelter', '@MKTWRetirement', '@ClaudiaAssisMW
', '@TomiKilgore', '@EllieIsma', '@capitolreport', '@elizobrien', '@SilviaAscarelli', '@wmwitkowski', '@MKTWeconomics', '@MKTWGraphics', '@JohnWordock', '@SAFmedia']

将此类的观察者添加到NSNotificationCenter,同样在viewDidLoad中

func fetchParseObjects () {}

以deinit方法删除观察者

NSNotificationCenter.defaultCenter().addObserver(self, selector: "objectUpdated:", name: "objectUpdated", object: nil)

在我做类似事情的地方,我创建了一个自定义对象来保存需要更新的对象以及应该如何更新的一些属性。

查看更新的控制器

执行您通常执行的操作,但发送带有描述性对象的通知,以便相应地更新原始数据

deinit {

    NSNotificationCenter.defaultCenter().removeObserver(self, name: "objectUpdated", object: nil)
}

func objectUpdated(notification: NSNotification) {

    if let yourKindOfObject = notification.object as? YOUR_TYPE_HERE {

        // Add, update or remove an item from the array that holds the original fetched data here based on the object
        // Update your tableView accordingly (add, remove or update)
    }