2017-06-03 41 views
0

我有一个pfquery tableview控制器,在我的pfquerytableviewcontroller中正在加载的类中有许多pfobjects。我有问题。当我刷新我的表格视图时,在调试器中出现此错误“警告:正在主线程上执行长时间运行的操作。 断开warnBlockingOperationOnMainThread()以进行调试。”当我尝试在桌面视图中滑动时,桌面视图会非常缓慢地滑动并滑动。我认为这是因为数据正在主线程中加载而发生的。这是我的代码。有人能告诉我我能做些什么来解决这两个问题。非常感激。谢谢主线程pfquerytableviewcontroller

class ProductTableViewController: PFQueryTableViewController{ 
override func queryForTable() -> PFQuery<PFObject> { 
    var query : PFQuery<PFObject>! 


     query = PFQuery(className: "Products") 
     query.includeKey("User") 
     query.limit = 25 
     query.skip = 25 

       query.order(byAscending: "createdAt") 

} 


override func viewDidLoad() { 
    super.viewDidLoad() 
    let nib = UINib(nibName: "ProductTableViewCell", bundle: nil) 
    tableView.register(nib, forCellReuseIdentifier: reuseIdentifier) 
} 
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath, object: PFObject?) -> PFTableViewCell? { 
    let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! ProductTableViewCell 

    if let files : [PFFile] = object?["Images"] as? [PFFile] { 
     cell.ProductImage.file = files.first 
     cell.ProductImage.loadInBackground() 
    } 

    } 
    } 
+0

我曾经涉足Android。当开发人员将重要任务放在UI线程中时,移动操作系统框架会讨厌它。在Android中,我们实现AsynchTask在另一个线程上工作。让你免于挂断用户界面。我不知道这是什么混杂的Swift版本。 –

+0

我迷失在我应该做的事情上。我不认为解析会为pfquerytableview控制器创建框架,并肯定会在主线程上出现操作和崩溃。有一种解决方案我还不知道。 – ahmed

+0

试着看http://docs.parseplatform.org/ios/guide/ 我刚刚做了,他们在本指南中提到了PFQuery中提到的后台查询功能。 –

回答

0

为什么不使用普通的tableViewController?

var show = 0 
let maxload = 250 
var objects = [PFObject]() 

func loaddata() { 
    self.objects.removeAll(keepingCapacity: false) 
    self.show = 25 

    let query = PFQuery(className:"Ledger") 
    query.limit = self.maxload 
    query.findObjectsInBackground { 
     (objects: [PFObject]?, error: Error?) -> Void in 
     if error == nil { 
      if let objects = objects as [PFObject]! { 
       for object in objects { 
        self.objects.append(object) 
       } 
       //reload TableView 
       self.tableView.reloadData() 
       print("retrieved \(self.objects.count)") 

      } 
     } 
    } 
} 

@IBAction func refreshButton(_ sender: AnyObject) { 
    loaddata() 
    self.tableView.reloadData() 
} 

func numberOfSections(in tableView: UITableView) -> Int { 
    if self.objects.count <= 0 { 
     return 0 
    } else { 
     if show > self.objects.count { 
      return self.objects.count 
     } else if show > maxload { 
      return maxload 
     } else { 
      return show 
     } 
    } 
} 


func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    if (indexPath as NSIndexPath).section == self.show - 1 { 
     self.show += 25 
     print("showing more data") 
    } 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 1 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TableViewController 

    if self.objects.count - 1 > (indexPath as NSIndexPath).section { 
     let objects = self.objects[(indexPath as NSIndexPath).section] 
    } 

    return cell 
}