如何运行解析查询循环?

时间:2014-11-08 16:11:20

标签: ios parse-platform

我正在创建一个注册用户并允许他们添加朋友等的应用程序。所以我有一个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数组中打印第一个对象的用户名。

2 个答案:

答案 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 );
    }