我正在创建一个注册用户并允许他们添加朋友等的应用程序。所以我有一个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 );
}
}
但这似乎不成功,因为在控制台上没有记录任何内容,只要一个查询完成,它就应该记录检索到的朋友的用户名。我这样做是对的吗?我的数组计数是正确的,因此循环运行到用户拥有的朋友数量。如果我将logging命令放在循环中,它还会在objectIds数组中打印第一个对象的用户名。
答案 0 :(得分:0)
在NSLog
个对象排队等待执行后,query
会立即运行。因此,即使代码运行正常(我怀疑它可能不是),您在登录控制台后也永远无法获得正确的结果。
如果您以某种方式设计了Parse类,则可以使用include
上的PFQuery
方法将其折叠为1个查询。这假定您已在User
对象上创建了一个指针数组,名为&#34; friends&#34;。如果您实际存储了每个朋友的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
}
}];
}
答案 1 :(得分:0)
找到它。不是最漂亮的方式,但它做我想要的。获取朋友数组中包含的每个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 );
}