繁体   English   中英

如何运行解析查询循环?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM