2015-01-07 4 views
0

В моем запросе NSLog хорош тем, что пишет хорошие вещи NSLog(@"DANS MSG ENVOYE PAR USER : %@", _messages, но из запроса в viewDidLoad я не могу получить доступ к значению от моего NSArrayДоступ NSArray из Разбор запроса

NSLog(@"DESTINATEUR MSG : %@", self.senderMsg); 
NSLog(@"EN DEHORS QUERY : %@", self.messages); 

ли я к реализовать @synthesize? Что я делаю не так ?

Вот мой код.

ChatViewController.h:

#import "MessagesViewController.h" 

@interface ChatViewController : MessagesViewController 

@property (strong, nonatomic) NSMutableArray *messages; 
@property (strong, nonatomic) NSString *destinateurChat; 
@property (strong, nonatomic) NSArray *senderMsg; 
@property (strong, nonatomic) NSArray *destinateurMsg; 

@end 

ChatViewController.m:

#import "ChatViewController.h" 
#import <Parse/Parse.h> 
#import "SVProgressHUD.h" 

@interface ChatViewController() 

@end 
id message; 
NSDate *receiveDate; 
NSString *text; 
@implementation ChatViewController 
@synthesize destinateurMsg = _destinateurMsg; 
@synthesize messages = _messages; 

#pragma mark - View lifecycle 
- (void)viewDidLoad 
{ 

    [super viewDidLoad]; 
    self.title = @"Messages"; 
    PFQuery *query1 = [PFQuery queryWithClassName:@"Chat"]; 
    [query1 whereKey:@"DestinateurId" equalTo:self.destinateurChat]; 
    [query1 whereKey:@"senderId" equalTo:[[PFUser currentUser] objectId]]; 
    PFQuery *query2 = [PFQuery queryWithClassName:@"Chat"]; 
    [query2 whereKey:@"DestinateurId" equalTo:[[PFUser currentUser] objectId]]; 
    [query2 whereKey:@"senderId" equalTo:self.destinateurChat]; 
    // PFQuery *hotelQuery = [PFQuery orQueryWithSubqueries:@[query1, query2]]; 

    //Message envoyé par l'user 
    [query1 findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     if (!error) { 
      _senderMsg = [objects valueForKey:@"text"]; 
      _messages = [[NSMutableArray alloc] init]; 
      [_messages addObjectsFromArray:_senderMsg]; 
      NSLog(@"DANS MSG ENVOYE PAR USER : %@", _messages); 

    //Messages destiné à l'user 
      [query2 findObjectsInBackgroundWithBlock:^(NSArray *objects2, NSError *error) { 
       if (!error) { 
        self.destinateurMsg = objects2; 
        [self.messages addObjectsFromArray:self.destinateurMsg]; 
       } else { 
        // Log details of the failure 
        NSLog(@"Error: %@ %@", error, [error userInfo]); 
       } 
      }]; 
     } else { 
      // Log details of the failure 
      NSLog(@"Error: %@ %@", error, [error userInfo]); 
     } 
    }]; 


    NSLog(@"DESTINATEUR MSG : %@", self.senderMsg); 
    NSLog(@"EN DEHORS QUERY : %@", self.messages); 
    UIButton *exitButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [exitButton addTarget:self action:@selector(backToInboxView) forControlEvents:UIControlEventTouchUpInside]; 
    [exitButton setTitle:@"Inbox" forState:UIControlStateNormal]; 
    exitButton.frame = CGRectMake(0.0, 0.0, 60, 60); 
    [self.view addSubview:exitButton]; 

    } 
+0

Не может быть, потому что это асинхрон? – Larme

+0

@ Larme Спасибо за ответ. Так что я должен делать? Я не могу получить доступ к этому NSArray из этого запроса? – Viny76

+0

Вы получаете какую-либо ошибку или «self.senderMsg» не печатает массив? –

ответ

2

Вы не можете получить доступ к self.senderMsg и self.messages в этих строках

NSLog(@"DESTINATEUR MSG : %@", self.senderMsg); 
NSLog(@"EN DEHORS QUERY : %@", self.messages); 

, потому что его выполняется до запроса Asynchronous является завершено.

[query1 findObjectsInBackgroundWithBlock:] - это асинхронная функция, которая исключается в фоновом потоке. После вызова этих функций выполнение внутри viewDidLoad продолжается до конца функции. В то время в NSLog массивы будут пустыми.

Если вы хотите использовать значения массива, используйте его внутри findObjectsInBackgroundWithBlock.

[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
    if (!error) { 
     // You can use it in this block. 
     // Reload Data here like [self.tableView reloadData] 
    } 
}] 
+0

Хорошо, я понимаю, почему это не работает. Но, нет способа использовать его findObjectsInBackgroundWithBlock? Потому что я должен использовать его в другом методе: - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) раздел { { return self.messages.count; } и - (NSString *) textForRowAtIndexPath: (NSIndexPath *) indexPath { возврата [self.messages objectAtIndex: indexPath.row]; } – Viny76

+1

вызывать '[self.tableview reloadData]' внутри '[query2 findObjectsInBackgroundWithBlock]'. – rakeshbs

+1

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

Смежные вопросы