override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell
var query = PFQuery(className:"category")
let object = objects[indexPath.row] as String
query.whereKey("type", equalTo:"DRUM")
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]!, error: NSError!) -> Void in
if error == nil {
for object in objects {
NSLog("%@", object.objectId)
let abc = object["link"]
println("the web is \(abc)")
cell.textLabel!.text = "\(abc)"
}
} else {
NSLog("Error: %@ %@", error, error.userInfo!)
}
}
return cell
}
添加let object = objects[indexPath.row] as String
后无法加载视图,删除该行只显示一行成功。
答案 0 :(得分:0)
首先,我建议您在cellForRowAtIndexPath之外获取您的单元格数据。此函数不是从解析接收数据的好地方。创建另一个函数并创建一个类变量并放置句柄从那里获取数据。
let object = objects[indexPath.row] as String
for object in objects
尽量不要为不同的东西使用相同的变量名称,因为它们会让你感到困惑。
这条线在目前似乎没有任何贡献。尝试删除它:
let object = objects[indexPath.row] as String
答案 1 :(得分:0)
首先让我们考虑原则。不要从单独的线程更新UI,其行为是意外的或未定义的。它工作或工作很奇怪。
其次,你遇到的问题是当VC加载时,tableView的数据源在那里被调用,然后在主线程上被调用。现在,您尝试通过在单独的线程中执行异步调用来在单元格上添加一些内容,这将需要一些时间,主线程在调用解析时不会等待。如果您在Async中遇到困难,请查看文档,这对于掌握少数术语和原则非常重要。
事情是你的主线程从上到下运行,而不等待每个对服务器的调用,即在单元生成中异步。因此该调用的结果将在稍后发布,您也不会在主线程上发布。
此外,我建议你不要为大项目或可管理的代码库做这种方法。我通常做的是:
我希望我能澄清一些问题。希望它能帮到你。干杯!
//a computed var that is initialized to empty array of string or anything you like
//we are observing the value of datas. Observer Pattern.
var datas = [String](){
didSet{
dispatch_async(dispatch_get_main_queue(), {
//we might be called from the parse block which executes in seperate thread
tableView.reloadData()
})
}
}
func viewDidLoad(){
super.viewDidLoad()
//call the parse to fetch the data and store in the above variable
//when this succeeds then the table will be reloaded automatically
getDataFromParse()
}
//get the data: make it specific to your needs
func getDataFromParse(){
var query = PFQuery(className:"category")
//let object = objects[indexPath.row] as String //where do you use this in this block
var tempHolder = [String]()
query.whereKey("type", equalTo:"DRUM")
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil && objects != nil {
for object in objects!{
//dont forget to cast it to PFObject
let abc = (object as! PFObject).objectForKey("link") as? String ?? "" //or as! String
println("the web is \(abc)")
tempHolder.append(abc)
}
} else {
print("error") //do some checks here
}
}
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell
cell.textLabel!.text = datas[indexPath.row]
return cell
}