2014-11-08 79 views
0

我正在製作一個註冊用戶的應用程序,並允許他們添加好友等。所以我有一個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數組中的第一個對象的用戶名,如果我把日誌記錄命令在循環中。

回答

0

發現了它。不是最好的方式,但它做我想做的。獲取我的朋友陣列中包含的每個對象ID的用戶名和個人資料圖片數組。

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); 
    } 
0

您的NSLog在您的query對象排隊等待執行後立即運行。因此,即使代碼運行正常(並且我懷疑它可能不是),在登錄到控制檯後,您將永遠得不到正確的結果。

如果您以某種方式設計了Parse類,則可以使用PFQuery上的include方法將其摺疊爲1個查詢。這假設您已在User對象上創建了一個名爲「朋友」的指針數組。如果您實際存儲每個朋友的objectId(即字符串值),則此代碼將不起作用。

我不使用斯威夫特還沒有,所以這裏就是我想在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 

     } 
    }]; 
} 
+0

我的查詢顯示friendsList Array中的第一個objectID的用戶名,但沒有別的。我不太清楚你提到的模式。這就是我所理解的,我必須創建一個指向數組「FriendsList」的每個成員的指針數組。這是我的數據庫中的數組類型列,這就是我存儲用戶的朋友 – NSNoob 2014-11-10 06:42:33