2016-04-04 81 views
0

我已经搜索,并没有发现任何人发布了这样的东西,但如果是这样,请随时指出我在正确的方向!使用实例填充UITableview填充数组

因此,使用MVC,我在创建实例,我UITableviewcontroller

var brainLink = LessonBrain() 

这是我的viewDidLoad应该获取数据并填充阵列 'subjectNameOneDay':

let todoDictionary = NSUserDefaults.standardUserDefaults().dictionaryForKey("subjectDictionary") ?? [:] 

    brainLink.parseQuery(self.setupData.integerForKey("pupilNumber"), dictName: "subjectDictionary") 

    self.subjectNameOneDay = todoDictionary["TwoTuesday"]! as! NSArray 

self.tableView.reloadData()

brainLink实例调用方法'parseQuery':

func parseQuery(numberToRetreive: Int, dictName:String) { 
     var tempArray:[String] = [] 


     if self.daysOfTheWeek.contains("\(self.currentDayOfTheWeekForLabel)") { 

      print(currentDayOfTheWeekForLabel) 


      print("parse query for data number \(numberToRetreive) started") 

      let query:PFQuery = PFQuery(className: self.setupData.valueForKey("organisationID") as! String) 
      query.fromLocalDatastore() 
      query.whereKey("PupilNumber", equalTo: "\(numberToRetreive)") 
      query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in 

       if (error == nil) { 

        print("Successfully retrieved 2 \(objects)") 

        for object in objects! { 

         var periodCounter = 1 

         while periodCounter <= 6 { 

          print(self.currentDayOfTheWeekForData) 


          tempArray.append(object.valueForKey("\(self.currentDayOfTheWeekForData)P\(periodCounter)") as! String) 
          print(tempArray) 

          periodCounter += 1 

         } 

         self.addItem(tempArray, weekDayPeriod: self.currentDayOfTheWeekForData, dictionaryName: dictName) 

        } 
       }else { 
        print(error!.userInfo) 
       } 
      } 
     }else{ 
      print("It's the weekend!") 
     } 
     print("query function returning temp array") 

    } 

这一切工作正常,并填充数组,但我遇到的问题是,无论我已经尝试或我把我的地方self.tableView.reloadData()它不会'等待'数据提取之前尝试重新加载桌子。

我在哪里可以放这个代码/安排它,因此它提取数据然后重新加载?

+0

的reloadData添加到您的回调,而不是视做负载。到此为止,新数据将被检索。 – MDB983

+0

我的无知道歉.....我怎么将它添加到我的回调?你的意思是从parseQuery函数返回self.tableView.reloadData()? – MartynE23

+0

是的,但你需要通过引用的地址,所以_weak MyTableViewClass * MyClass = self。然后在解析查询函数mylass.reloadData(你应该检查我的类在调用它的方法之前没有被删除掉)。你需要确保在我的class.reloadData被调用之前tableview数据源也被填充。 – MDB983

回答

0

上面一行:

query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in

启动一个完成处理程序。只要调用完成,该块就会运行,所以执行的线程将继续执行,这就是为什么当你的调用运行时,它还没有将对象添加到你的数组中。

如果你把你的reloadData调用作为这个块中发生的最后一件事,你会更接近于得到你想要的结果。

您还应该确保您在进行UI调用时正在主线程上运行。由于您完成块可以在任何线程执行,你可以这样做:

  dispatch_async(dispatch_get_main_queue(), { 
       self.tableView.reloadData() 
      }) 
+0

感谢马修.......把重新加载在块的最后一行给我一个错误.....该方法是在另一个类不是UITableViewController子类,所以无法加载。上面的代码放在哪里? – MartynE23

+0

您可以使用函数调用将上面的重新加载调用替换为您的类,您可以在该表上调用重新加载。 –