2016-06-29 10 views
0

タスクという名前の配列にTaskオブジェクトを追加しようとしていて、それをカテゴリ別にfilteredTasksという別の配列にフィルタリングしています。コンソールでオブジェクトは配列に追加されていません - swift iOS

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のカウントは理由がありますタスクが配列に追加されていませんか?

答えて

0

このようにすることはできません。メソッドobserveEventTypeは非同期です。クロージャをパラメータとして受け取ります。クロージャが実行される前にすぐに戻ります。

完了クロージャを実行するためにloadTasks関数を書き直す必要があります。その後、タスク配列がいっぱいになると、実行したいコードで呼び出すことになります。作業例については、このスレッドに私の答えを参照してください。

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

+0

本当にありがとうございました、全く今理にかなっています。私は本当にあなたの助けに感謝します! –

関連する問題