2014-01-12 3 views
0

Я пытаюсь заполнить UITabelView списком друзей Facebook. Я проверил все связанные вопросы и попробовал все ответы, однако он все еще не работает. Прошло больше 4 часов, и этот простой код тратит мое время.Populate UITableView с друзьями на Facebook

@interface InviteViewController() 

{ 

__block NSArray *friends; 
__block NSMutableArray *mArray; 
} 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
// Return the number of rows in the section. 
FBRequest* friendsRequest = [FBRequest requestForMyFriends]; 
[friendsRequest startWithCompletionHandler: ^(FBRequestConnection *connection, 
               NSDictionary* result, 
               NSError *error) { 
    friends = [result objectForKey:@"data"]; 
    NSLog(@"Found: %i friends",friends.count); 
    for (NSDictionary<FBGraphUser>* friend in friends) { 
     NSLog(@"I have a friend named %@ with id %@", friend.name, friend.id); 
     [mArray addObject:friend.name]; 
    } 

}]; 
NSLog(@"%d",mArray.count); 
return mArray.count; 
} 

и вот моя консоль журнала:

2014-01-12 20:18:21.429 PixidizeStoryBoard[26269:60b] 0 
2014-01-12 20:18:21.742 PixidizeStoryBoard[26269:60b] Found: 1 friends 
2014-01-12 20:18:21.744 PixidizeStoryBoard[26269:60b] I have a friend named Siavash ALp with id 1524650444 

ответ

1

Похоже, он работает. Он находит одного друга.

Я думаю, что вызов startWithCompletionHandler: - это асинхронный вызов. Поэтому он вызовет тег, а затем сразу запустит строку NSLog(@"%d",mArray.count); и вернет еще пустой NSMutableArray. Затем после того, как этот блок вызывается из фонового потока.

^(FBRequestConnection *connection, 
               NSDictionary* result, 
               NSError *error) { 
    friends = [result objectForKey:@"data"]; 
    NSLog(@"Found: %i friends",friends.count); 
    for (NSDictionary<FBGraphUser>* friend in friends) { 
     NSLog(@"I have a friend named %@ with id %@", friend.name, friend.id); 
     [mArray addObject:friend.name]; 
    } 

И вы можете увидеть один друг после входа в NSLog, но вот почему это происходит после первого звонка в NSLog. Поэтому вместо того, чтобы возвращать NSMutableArray назад, добавьте что-то в конец вашего блока, который вместо этого обновит ваш UITableView.

Это имеет смысл?

+0

спасибо. Я решил по-другому, мне удалось получить список друзей перед загрузкой (segue) UITableView, а затем передать массив друга в методе prepareForSegue в UITableView, и он отлично работает. – user2427421

0
- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
//[self.spinnerView setHidden:YES]; 
self.navigationController.title = @"Create Event"; 
FBRequest* friendsRequest = [FBRequest requestForMyFriends]; 
[friendsRequest startWithCompletionHandler: ^(FBRequestConnection *connection, 
               NSDictionary* result, 
               NSError *error) { 
    __block NSArray *friends; 

    friends = [result objectForKey:@"data"]; 
    NSLog(@"Found: %i friends",friends.count); 
    for (NSDictionary<FBGraphUser>* friend in friends) { 
     NSLog(@"I have a friend named %@ with id %@", friend.name, friend.id); 

    } 
    [self setArrayWithArray:friends]; 
}]; 

// Do any additional setup after loading the view. 
} 
- (void)setArrayWithArray:(NSArray *)array 
{ 
self.myFriends = [NSMutableArray array]; 
for (NSDictionary<FBGraphUser>* friend in array) { 
    [self.myFriends addObject:friend.name]; 

} 
} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
if ([segue.identifier isEqualToString:@"invite"]) { 
    InviteViewController *ivc = segue.destinationViewController; 
    ivc.myImage = self.img; 
    ivc.nameField2 = self.nameField.text; 
    ivc.locationField2 = self.locationField.text; 
    ivc.friendsArray = self.myFriends; 
} 
} 
Смежные вопросы