gpt4 book ai didi

ios - 如何避免由于多次触发函数而在 tableView 上出现重复的项目?

转载 作者:行者123 更新时间:2023-11-30 14:11:57 25 4
gpt4 key购买 nike

我的问题是我正在查询 viewDidLoad 中的元素并将其添加到 tableView 中。在另一个 View 上,用户可以将元素添加到 Parse,我在 viewDidAppear 上再次查询以仅显示新添加的元素,而不需要重新加载 View 。这些元素是用户的类别,包括姓名、年龄等...

在 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()”。

您知道如何解决这个问题吗?无限感谢您,

最佳答案

另一种方法是在将新对象添加到另一个 View Controller 中后将其添加到数组中,然后为其添加一个新行到 TableView 中。我建议通过 NSNotification 来传达新形成的对象。

带表格的 View Controller

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

func fetchParseObjects () {}

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

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

在 deinit 方法中删除观察者

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

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

查看更新的 Controller

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

NSNotificationCenter.defaultCenter().postNotificationName("objectUpdated", object: YOUR_OBJECT_WITH_UPDATE_DATA) 

关于ios - 如何避免由于多次触发函数而在 tableView 上出现重复的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31677497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com