函数被调用两次,导致表视图重新加载两次

问题描述 投票:0回答:1

我的viewWillAppear中有一个函数loadStories(),用于加载表格视图。由于某些原因,有时会被两次调用。我尝试通过添加布尔值fetchedStories来避免这种情况,以便如果它第二次运行并且布尔值是true,则它什么也不做。但是,即使将fetchedStories设置为true,它仍然会重新运行loadStories()

loadStories函数

var fetchedStories: Bool

@objc func loadStories(){
    // Load stories
    fetchedStories = false
    var uniqueStories = unique(story: storyData)
    storyData.removeAll()
    uniqueStories.removeAll()
    let colorArray = [purple, green, orange, red, blue]
    let colorNumber:Int = Int(arc4random_uniform(5))
    let colorName = colorArray[colorNumber]
    refreshControl.tintColor = colorName
    let query = PFQuery(className: "UserInvitations")
    query.whereKey("guests", contains: PFUser.current()!.username!)
    query.findObjectsInBackground(block: {(objects, error) -> Void in
        if error == nil && objects != nil {
            print(objects)
            for object in objects! {
                let userList = object["guests"] as! NSArray
                for user in userList {
                    self.friendList.append(user as! String)
                }
            }
            self.friendList.removeDuplicates()
            let userIndex = self.friendList.index(of: PFUser.current()!.username!)
            if userIndex != nil{
                self.friendList.remove(at: userIndex!)
            }
            DispatchQueue.main.async{
                self.fetchStories()
            }
        }else{
            // Server error, show alert
            self.refreshControl.endRefreshing()
            let bannerSubtitle = NSLocalizedString("Please refresh the feed.", comment: "")
            let banner = NotificationBanner(title: "Oops", subtitle: bannerSubtitle, style: .danger, colors: CustomBannerColors())
            banner.show()
        }
    })
}

fetchStories函数

 @objc func fetchStories(){
        print("fetchStories")
        if fetchedStories == true {
            // Already fetched, do nothing
            print("Already fetched")
        }else{
            var uniqueStories = unique(story: storyData)
            storyData.removeAll()
            uniqueStories.removeAll()
            print("fetching")
            let query = PFQuery(className: "Stories")
            query.whereKey("user", containedIn: self.friendList)
            query.order(byDescending: "updatedAt")
            query.findObjectsInBackground(block: {(objects, error) -> Void in
                if error == nil{
                    self.fetchedStories = true
                    if objects?.count == 0 {
                        self.fetchedStories = true // Supposed to prevent function from running again
                        let bannerSubtitle = NSLocalizedString("There are no stories.", comment: "")
                        let banner = NotificationBanner(title: "Oops", subtitle: bannerSubtitle, style: .info, colors: CustomBannerColors())
                        banner.show()
                        let storyImage = UIImage(named: "Add Story")
//                        let addStoryImage = PFFileObject(data: storyImageData!)
                        self.storyData.append(StoryData(username: NSLocalizedString("Add a story", comment: ""), storyPreview: storyImage!, storyID: "", timeSince: ""))
                        self.refreshControl.endRefreshing()
                        self.storyTableView?.reloadData()
                    }else{
                        self.fetchedStories = true
                        print("story success")
                        print(objects)
                        // Populate table view
                        if let objects = objects{
                            for object in objects{
                                let username = object["user"] as! String
                                let storyImage = object["story"] as! PFFileObject
                                let storyID = object.objectId!
                                let timeSince = object.createdAt!
                                var storyImageFile: UIImage!
                                do{ let data = try storyImage.getData()
                                    if data != nil{
                                        try storyImageFile = UIImage (data: data)
                                    }
                                }catch{}
                                self.storyData.append(StoryData(username: username, storyPreview: storyImageFile, storyID: storyID, timeSince: timeSince.timeAgoDisplay()))
                            }
                        }
                        self.refreshControl.endRefreshing()
                        var uniqueStories = self.unique(story: self.storyData)
                        print("storyData is \(uniqueStories)")
                        self.storyTableView?.reloadData()
                    }
                }else{
                    print("story error")
                    self.fetchedStories = true
                    self.refreshControl.endRefreshing()
                    let bannerSubtitle = NSLocalizedString("Please refresh the feed.", comment: "")
                    let banner = NotificationBanner(title: "Oops", subtitle: bannerSubtitle, style: .danger, colors: CustomBannerColors())
                    banner.show()
                }
            })
        }
    }
ios swift uitableview
1个回答
0
投票

@ luckystars的答案。只需将fetchedStories设置为true作为}else{语句的第一行即可。

工作代码

@objc func fetchStories(){
        print("fetchStories")
        if fetchedStories == true {
            // Already fetched, do nothing
            print("Already fetched")
        }else{
            fetchedStories = true
            var uniqueStories = unique(story: storyData)
            storyData.removeAll()
            uniqueStories.removeAll()
            print("fetching")
            let query = PFQuery(className: "Stories")
            query.whereKey("user", containedIn: self.friendList)
            query.order(byDescending: "updatedAt")
            query.findObjectsInBackground(block: {(objects, error) -> Void in
                if error == nil{
                    if objects?.count == 0 {
                        let bannerSubtitle = NSLocalizedString("There are no stories.", comment: "")
                        let banner = NotificationBanner(title: "Oops", subtitle: bannerSubtitle, style: .info, colors: CustomBannerColors())
                        banner.show()
                        let storyImage = UIImage(named: "Add Story")
                        self.storyData.append(StoryData(username: NSLocalizedString("Add a story", comment: ""), storyPreview: storyImage!, storyID: "", timeSince: ""))
                        self.refreshControl.endRefreshing()
                        self.storyTableView?.reloadData()
                    }else{
                        self.fetchedStories = true
                        print("story success")
                        print(objects)
                        // Populate table view
                        if let objects = objects{
                            for object in objects{
                                let username = object["user"] as! String
                                let storyImage = object["story"] as! PFFileObject
                                let storyID = object.objectId!
                                let timeSince = object.createdAt!
                                var storyImageFile: UIImage!
                                do{ let data = try storyImage.getData()
                                    if data != nil{
                                        try storyImageFile = UIImage (data: data)
                                    }
                                }catch{}
                                self.storyData.append(StoryData(username: username, storyPreview: storyImageFile, storyID: storyID, timeSince: timeSince.timeAgoDisplay()))
                            }
                        }
                        self.refreshControl.endRefreshing()
                        var uniqueStories = self.unique(story: self.storyData)
                        print("storyData is \(uniqueStories)")
                        self.storyTableView?.reloadData()
                    }
                }else{
                    print("story error")
                    self.fetchedStories = true
                    self.refreshControl.endRefreshing()
                    let bannerSubtitle = NSLocalizedString("Please refresh the feed.", comment: "")
                    let banner = NotificationBanner(title: "Oops", subtitle: bannerSubtitle, style: .danger, colors: CustomBannerColors())
                    banner.show()
                }
            })
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.