TableView Segue to new ViewController 不起作用两次
TableView Segue to new ViewController does not work twice
我有一个 TableViewController,其中选择一行进行网络调用,显示一个 activity 指示器,并在网络调用的完成块中停止指示器并进行推送转场。
在测试中,我发现当转到新的视图控制器、返回并选择另一行时,它会显示 activity 指示器,但不会停止或调用 push segue。 didSelect 的代码:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.tableView.userInteractionEnabled = false
self.searchController?.active = false
self.idx = indexPath
let cell = tableView.cellForRowAtIndexPath(indexPath) as! CustomTableViewCell
cell.accessoryView = self.activityIndicator
self.activityIndicator.startAnimating()
self.networkingEngine?.getObjectById("\(objectId)", completion: { (object) -> Void in
if object != nil {
self.tableView.userInteractionEnabled = true
self.chosenObject = object
self.activityIndicator.stopAnimating()
self.tableView.reloadRowsAtIndexPaths([self.idx], withRowAnimation: .None)
self.tableView.deselectRowAtIndexPath(self.idx, animated: true)
self.performSegueWithIdentifier("segueToNewVC", sender: self)
}
else {
}
})
}
以及我使用 Alamofire 的网络呼叫
func getObjectbyId(objectId: String, completion:(Object?) -> Void) {
Alamofire.request(Router.getObjectById(objectId: objectId))
.response { (request, response, data, error) -> Void in
if response?.statusCode != 200 {
completion(nil)
}
else if let parsedObject = try!NSJSONSerialization.JSONObjectWithData(data as! NSData, options: .MutableLeaves) as? NSDictionary {
let object = parsedObject["thing"]
dispatch_async(dispatch_get_main_queue(), { () -> Void in
completion(object)
})
}
}
}
所以我下了断点,它实际上是第二次进入完成块并调用它来停止指示器,重新加载该行,取消选择该行,重新启用 tableView userInteraction,然后执行 segue。它也调用了我的 prepareForSegue,但一旦它完成,它就坐在那里,指示器仍在旋转,并且 RAM 使用率飙升至近 2GB,直到模拟器崩溃。
我认为它与多线程有关,但我无法缩小确切问题的范围,因为我将我的重要内容放在主线程上。
问题与使单元格的 accessoryView 成为 activityIndicator 然后将其删除并重新加载它有关,同时继续进行。我无法弄清楚如何将它保留在那里并停止多线程问题,但我选择了进度 AlertView。如果有人有解决方案,我很想知道这是如何解决的。
我有一个 TableViewController,其中选择一行进行网络调用,显示一个 activity 指示器,并在网络调用的完成块中停止指示器并进行推送转场。
在测试中,我发现当转到新的视图控制器、返回并选择另一行时,它会显示 activity 指示器,但不会停止或调用 push segue。 didSelect 的代码:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.tableView.userInteractionEnabled = false
self.searchController?.active = false
self.idx = indexPath
let cell = tableView.cellForRowAtIndexPath(indexPath) as! CustomTableViewCell
cell.accessoryView = self.activityIndicator
self.activityIndicator.startAnimating()
self.networkingEngine?.getObjectById("\(objectId)", completion: { (object) -> Void in
if object != nil {
self.tableView.userInteractionEnabled = true
self.chosenObject = object
self.activityIndicator.stopAnimating()
self.tableView.reloadRowsAtIndexPaths([self.idx], withRowAnimation: .None)
self.tableView.deselectRowAtIndexPath(self.idx, animated: true)
self.performSegueWithIdentifier("segueToNewVC", sender: self)
}
else {
}
})
}
以及我使用 Alamofire 的网络呼叫
func getObjectbyId(objectId: String, completion:(Object?) -> Void) {
Alamofire.request(Router.getObjectById(objectId: objectId))
.response { (request, response, data, error) -> Void in
if response?.statusCode != 200 {
completion(nil)
}
else if let parsedObject = try!NSJSONSerialization.JSONObjectWithData(data as! NSData, options: .MutableLeaves) as? NSDictionary {
let object = parsedObject["thing"]
dispatch_async(dispatch_get_main_queue(), { () -> Void in
completion(object)
})
}
}
}
所以我下了断点,它实际上是第二次进入完成块并调用它来停止指示器,重新加载该行,取消选择该行,重新启用 tableView userInteraction,然后执行 segue。它也调用了我的 prepareForSegue,但一旦它完成,它就坐在那里,指示器仍在旋转,并且 RAM 使用率飙升至近 2GB,直到模拟器崩溃。
我认为它与多线程有关,但我无法缩小确切问题的范围,因为我将我的重要内容放在主线程上。
问题与使单元格的 accessoryView 成为 activityIndicator 然后将其删除并重新加载它有关,同时继续进行。我无法弄清楚如何将它保留在那里并停止多线程问题,但我选择了进度 AlertView。如果有人有解决方案,我很想知道这是如何解决的。