TableView Segue到新的ViewController不能工作两次

时间:2015-07-18 19:07:19

标签: ios multithreading swift uitableview swift2

我有一个TableViewController,其中选择一行进行网络调用,显示一个activityIndi​​cator,并在网络调用的完成块中,停止指示器并执行推送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,直到模拟器崩溃。

我认为它与多线程有关但我无法缩小确切的问题,因为我将重要的东西放在主线程上。

1 个答案:

答案 0 :(得分:0)

问题与将单元的accessoryView设为activityIndi​​cator然后将其移除并重新加载所有这些问题有关。我无法弄清楚如何将其保留在那里并停止多线程问题,但我找到了进度AlertView。如果有人有解决方案,我很想知道这是如何解决的。