ios - 对象未添加到数组中 - swift iOS

标签 ios iphone arrays swift filter

我试图将任务对象添加到一个名为“任务”的数组中,然后将它们按类别过滤到另一个名为“filteredTasks”的数组中。

    var tasks = [Task]()
var filteredTasks = [Task]()    

override func viewDidLoad() {
    super.viewDidLoad()
    print(categoryPass)
    loadTasks()
    filterTasks(categoryPass!)
    if filteredTasks.isEmpty {
        filterTasks(categoryPass!)
    }
    print(filteredTasks)
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
    self.locationManager.requestWhenInUseAuthorization()
    self.locationManager.startUpdatingLocation()
    self.locationManager.delegate = self
    tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
    tableView.delegate = self
    tableView.dataSource = self

    // Do any additional setup after loading the view, typically from a nib.
}


func loadTasks() {
    var taskTitle: String?
    var id: String?
    var distance: Double?
    var category: String?

    var locationDict: [String:CLLocation] = [:]
    var refHandle = self.ref.child("tasks").observeEventType(FIRDataEventType.Value, withBlock: { (snapshot) in
        self.tasksDict = snapshot.value as? NSDictionary
        for i in 0 ..< self.tasksDict!.count {
            let taskId = self.tasksDict!.allKeys[i] as! String
            print ("1")
            id = taskId
           print (taskId)
            let task = self.tasksDict!.objectForKey(taskId) as! NSDictionary
            print ("2")
            let lat = task.objectForKey("latitude") as! String
            let long = task.objectForKey("longitude") as! String
            let latNum = Double(lat)! as CLLocationDegrees
            let longNum = Double(long)! as CLLocationDegrees
            taskTitle = task.objectForKey("title") as? String
            category = task.objectForKey("category") as? String
            print("3")
           // print (taskTitle)
            //print (category)

            let pointLocation = CLLocation(latitude: latNum, longitude: longNum)
            locationDict[taskId] = pointLocation
            if (self.locationCurrent == nil) {
                self.locationCurrent = self.locationManager.location!
            }
            print("4")
            distance = round(self.locationCurrent!.distanceFromLocation(pointLocation))
            var taskAddition = Task(title: taskTitle, id: id, distance: distance, category: category)
            print (taskAddition)
            self.tasks += [taskAddition]

        }
    })
}

func filterTasks(searchText: String, scope: String = "All") {
    print("filter")
    for i in 0 ..< tasks.count {
        let taskId = tasksDict!.allKeys[i] as! String
        //  print (taskId)
        let task = tasksDict!.objectForKey(taskId) as! NSDictionary
        let taskCategory = task.objectForKey("category") as! String
        if (taskCategory.lowercaseString.containsString(searchText.lowercaseString)) {
            filteredTasks.append(task[i] as! Task)
        }

    }

    self.tableView.reloadData()
}

数字 1、2、3 和 4 都在控制台中打印出来,但如果我尝试打印任务或filteredTasks,我会得到 [] 和计数 0。是否有原因导致任务不打印被添加到数组中?

最佳答案

你不能那样做。 observeEventType 方法是异步的。它采用闭包作为参数。它在关闭运行之前立即返回。

您需要重写 loadTasks 函数以获取完成闭包。然后,您可以使用任务数组填满后要执行的代码来调用它。请参阅我对此线程的回答以获取工作示例:

how to return value after the execution of the block? Swift

关于ios - 对象未添加到数组中 - swift iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38111692/

相关文章:

ios - Swift 如何从两个文本字段中获取 Int 并生成随机数

ios - 在 iOS 7 上本地验证应用内收据和捆绑收据的完整解决方案

iphone - iOS - 使用 sqlite 数据库更新数据不起作用

c++ - 这是什么意思 (C++) : "warning: pointer to a function used in arithmetic [Wpointer-arith]"?

javascript - 代码审查 : Deep filter array of objects concisely in Javascript

ios - 手动添加要查看的项目后无法滚动到 UIScrollView 的底部

ios - 在没有突变的情况下得到 "NSOrderedSetArrayProxy was mutated while being enumerated"错误

c# - Monotouch UITableView 或 MonoTouch.Dialog

javascript - 当到达下拉列表时点击 iphone 手机箭头键,它应该显示下拉列表内容

javascript - 如何从该数组 Vue JS 显示 HTML