[英]How to run a loop of parse queries?
我正在制作一个用于注册用户并允许他们添加朋友等的应用。因此,我有一个LoginViewController,当登录成功时,我在其中检索用户朋友的objectIds数组。 调用此函数。
- (void) getFriendList
{
NSString * objectID = [PFUser currentUser].objectId;
NSLog(@"%@", objectID);
PFQuery *query = [PFUser query];
[query getObjectInBackgroundWithId:objectID block:^(PFObject *username, NSError *error) {
sharedClass.sharedInstance->retrievedFriends = username[@"friendsIds"];
friendListLoaded = YES;
[self getFriendsUsernames];
}];
在这里,我得到一个数组对象,其中包含该用户拥有的所有朋友的对象ID。 如您所见,当getFriendList完成时,它将调用另一个名为GetFriendsUsernames的函数。 应该使用此功能来检索这些朋友的个人资料图片和用户名,以便以后可以填充“朋友列表”视图。
-(void) getFriendsUsernames
{
NSMutableArray * objectIDs = [[NSMutableArray alloc] initWithArray: sharedClass.sharedInstance->retrievedFriends];
PFQuery *query = [PFUser query];
int friendsCount = [objectIDs count];
for(int i = 0; i<=friendsCount;i++)
{
[query getObjectInBackgroundWithId:objectIDs[i] block:^(PFObject *username, NSError *error) {
[sharedClass.sharedInstance->friendsUsernames addObject:username[@"username"]];
[sharedClass.sharedInstance->friendsProfilePictures addObject:username[@"ProfilePicture"]];
}];
NSLog(@"%@", sharedClass.sharedInstance->friendsUsernames );
}
}
但这似乎是不成功的,因为在控制台上没有任何记录,每当一个查询完成时,控制台上都不会记录检索到的朋友的用户名。 我这样做正确吗? 我的数组数是正确的,因此循环运行到用户拥有的朋友数。 如果我将日志记录命令放入循环中,它还会在objectIds数组中打印第一个对象的用户名。
query
对象排队等待执行后, NSLog
将立即运行。 因此,即使代码运行正常(我怀疑可能不是),登录到控制台后也永远不会获得正确的结果。
如果您以某种方式设计了Parse类,则可以使用PFQuery
上的include
方法将其折叠为1个查询。 假设您已经在User
对象上创建了一个指针数组,命名为“ friends”。 如果您实际上存储了每个朋友的objectId
(即字符串值),则此代码将不起作用。
我尚未使用Swift,因此这是我在Objective-C中编写此查询的方式:
- (void)getFriendList {
PFUser *currentUser = [PFUser currentUser];
PFQuery *query = [PFUser query];
[query whereKey:@"objectId" equalTo:currentUser.objectId];
[query includeKey:@"friends.username"];
[query includeKey:@"friends.ProfilePicture"];
[query getFirstObjectInBackgroundWithBlock:^(PFObject *user, NSError *error) {
if (error != nil) {
// Process the error
} else }
// You've got your user and the data you wanted
}
}];
}
找到了。 不是最漂亮的方式,但是它可以满足我的要求。 让我得到一系列用户名和每个好友ID中包含的每个objectID的个人资料图片。
NSMutableArray * objectIDs = [[NSMutableArray alloc] initWithArray: sharedClass.sharedInstance->retrievedFriends];
PFQuery *query = [PFUser query];
PFFile * imageFile;
//UIImage *profilePictureData;
int friendsCount = [objectIDs count];
for(int i = 0; i<friendsCount;i++)
{
PFObject * username = [query getObjectWithId:objectIDs[i]];
[sharedClass.sharedInstance->friendsUsernames addObject:username[@"username"]];
[sharedClass.sharedInstance->friendsEmailAdresses addObject:username[@"email"]];
//NSLog(@"%@",username[@"ProfilePicture"]);
imageFile = [username objectForKey:@"ProfilePicture"];
NSData *imageData = [imageFile getData];
UIImage *imageFromData = [UIImage imageWithData:imageData];
[sharedClass.sharedInstance->friendsProfilePictures addObject:imageFromData];
NSLog(@"%@", sharedClass.sharedInstance->friendsUsernames );
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.