【发布时间】:2016-02-23 00:11:14
【问题描述】:
我有一个使用 Parse 作为后端的 iOS 应用程序。我有一个“用户”类,它有一个数组“myBooks”,其中包含指向“Books”类中的对象的指针。
我有两个视图控制器(vc1、vc2)来显示用户的所有书籍。 vc1按照createdAt降序加载每个用户的书。 Vc2 特定于 PFUser.currentUser,因此它是仅存在的每个单独用户的书籍列表(即,vc1 总共有 30 本书,vc2 有来自当前登录用户的 8 本书)。
手头的问题: 我已经实现了一个滑动删除功能,用户可以从数据库中删除他们的书籍,并且成功完成。新的书籍数组被更新并保存到当前用户的数据库中,删除的书籍不再存在。当我回到 vc1(我正在使用标签栏控制器)时,我有一个 viewDidAppear 函数试图从数据库中重新加载数据并重新加载 tableview。不幸的是,当向下滚动 tableview 时,应用程序总是因越界错误而崩溃。但是,我在vc1中有一个刷新按钮,如果我在回到vc1后按1-2次,就可以避免崩溃。
如何让 bookArray 从最初返回到 vc1 时实际加载和更新 tableview?
viewDidAppear 函数:
override func viewDidAppear(animated: Bool) {
if PFUser.currentUser() == nil{
self.loginVC = self.storyboard!.instantiateViewControllerWithIdentifier("login") as! LoginViewController
self.presentViewController(self.loginVC, animated: true, completion: nil)
}
else{
PFUser.currentUser()!.fetchInBackgroundWithBlock({ (object, error) -> Void in
if error == nil{
//do nothing
}
else{
let errorCode = error!.code
switch errorCode{
case 209:
PFUser.logOut()
self.loginVC = self.storyboard!.instantiateViewControllerWithIdentifier("login") as! LoginViewController
self.presentViewController(self.loginVC, animated: true, completion: nil)
default:
break
}
}
})
}
self.loadData()
}
加载数据函数:
func loadData(){
bookListing.removeAll()
let checkForNewBookData:PFQuery = PFQuery(className: "Book")
checkForNewBookData.orderByDescending("createdAt")
checkForNewBookData.findObjectsInBackground().continueWithSuccessBlock({ //sets up local data store correctly
(task: BFTask!) -> AnyObject! in
return PFObject.unpinAllObjectsInBackgroundWithName("LocalBooks").continueWithSuccessBlock({
(ignored: BFTask!) -> AnyObject! in
// Cache new results
let books = task.result as! [PFObject]
self.bookListing.removeAll()
self.bookListing = books
let userDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.setObject("true", forKey: "localData")
return PFObject.pinAllInBackground(books as [PFObject], withName: "LocalCabs")
})
})
let getBookData = PFQuery(className: "Book")
getBookData.orderByDescending("createdAt")
getBookData.fromLocalDatastore()
getBookData.findObjectsInBackgroundWithBlock { (objects : [PFObject]?, error : NSError?) -> Void in
if error == nil{
if let objects = objects{
for object in objects{
self.bookListing.append(object)
}
self.tableView.reloadData()
}
}
else{
let alert = UIAlertController(title: "Oops!", message: "Something went wrong. Try again.", preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "Okay", style: UIAlertActionStyle.Default, handler: nil))
self.presentViewController(alert, animated: true, completion: nil)
}
}
}
【问题讨论】:
标签: ios uitableview parse-platform pfquery viewdidappear