我有一个TableViewController,其中选择一行进行网络调用,显示一个activityIndicator,并在网络调用的完成块中,停止指示器并执行推送segue。
在测试中,我发现当转到新的视图控制器,返回并选择另一行时,它会显示活动指示器,但从不停止或调用推送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,直到模拟器崩溃。
我认为它与多线程有关但我无法缩小确切的问题,因为我将重要的东西放在主线程上。
答案 0 :(得分:0)
问题与将单元的accessoryView设为activityIndicator然后将其移除并重新加载所有这些问题有关。我无法弄清楚如何将其保留在那里并停止多线程问题,但我找到了进度AlertView。如果有人有解决方案,我很想知道这是如何解决的。