刚开始使用Parse构建iOS应用程序。我一丝不苟地按照入门指南进行操作,正如预期的那样,可以创建和保存Parse对象以及登录用户。不幸的是,当我创建一个PFQuery对象并尝试从parse中检索数据时,查询方法本身执行时没有错误,但是没有返回数据,在我的情况下忽略了代码块中的for-in语句。我觉得这个特别奇怪,因为我从Parse文档中复制粘贴了这段代码。
有人可以向我解释为什么这不起作用/为我提供更好的解决方案吗?会永远感激!!
这是我的代码:
(void)viewDidLoad {
[super viewDidLoad];
PFQuery *query = [PFQuery queryWithClassName:@"User"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
NSLog(@"Test 1 retrieved %d Users.", objects.count);
for (PFObject *object in objects) {
NSLog(@"Test 2 Retrived %d Users.", objects.count);
[self.array addObject: object];
}
} else {
NSLog(@"Error: %@ %@", error, [error userInfo]);
}
}];
NSLog(@"%@", self.array);
}
这是NSLog的结果:
2016-01-25 10:11:56.708 FSJ[4507:405721] (null)
2016-01-25 10:11:56.790 FSJ[4507:405721] Test 1 retrieved 0 Users.
注意:1)根据我的阅读,人们似乎认为这可能与线程有关,但我也尝试使用findObject方法,虽然不建议使用主线程,但收到相同的结果。 2)另外,认为它可能与访问权限有关,但我确保在我的数据浏览器中所有的读取,写入和添加权限都被检查并公开。
答案 0 :(得分:1)
您需要使用[PFQuery queryWithClassName:@"_User"];
代替[PFQuery queryWithClassName:@"User"];
更好的是,在查询PFUser类时应该使用以下内容
PFQuery *query = [PFUser query];
答案 1 :(得分:0)
[super viewDidLoad];
PFQuery *query = [PFQuery queryWithClassName:@"User"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
NSLog(@"Test 1 retrieved %d Users.", objects.count);
for (PFObject *object in objects) {
NSLog(@"Test 2 Retrived %d Users.", objects.count);
[self.array addObject: object];
}
//After the objects have been added to the array,
//Now log the array
NSLog(@"%@", self.array);
} else {
NSLog(@"Error: %@ %@", error, [error userInfo]);
}
}];
//This line will be executed before [query findObjectsInBackgroundWithBlock]
//Because it's run async. The array would not be populated yet at this point
//NSLog(@"%@", self.array);
答案 2 :(得分:0)
您实际上需要使用特定类型的查询,即用户查询PFUser.query()
这是swift
中的一个例子func fetchUsers() {
let userQuery: PFQuery = PFUser.query()!
userQuery.orderByAscending("username")
userQuery.whereKey("username", notEqualTo: (currentUser?.username)!)
userQuery.findObjectsInBackgroundWithBlock({
(users, error) -> Void in
var URLs = users!
if error == nil {
if URLs.count >= 1 {
for i in 0...users!.count-1 {
self.urlsArray.append(URLs[i].valueForKey("indexPathRow") as! Int)
}
}
self.usersArray = users as! [PFUser]
} else {
print(error)
}
})
}