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



我的视图中有一个函数loadStories()WillAppear,用于加载表视图。出于某种原因,有时它会被调用两次。我试图通过添加布尔fetchedStories来避免这种情况,这样如果它第二次运行并且布尔值为真,它不会什么都不做。但是,即使在将fetchedStories设置为 true 后,它仍然会重新运行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()
}
})
}

获取故事功能

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

来自@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()
}
})
}
}

最新更新