2014-09-21 3 views
-1

В настоящее время я разрабатываю свое первое приложение. Приложение представляет собой основное приложение для обмена сообщениями, основанное на Parse.com.Использование указателей с Parse.com

Я хочу создать PFQueryTableViewController, где он покажет последние чаты с другими пользователями.

Photo другого пользователя, Name другого пользователя и timestamp (аналогично Facebook messager "recent").

данные чатов сохраняются в синтаксическом классе по имени Room со следующими столбцами:

  1. ObjectId (строка)
  2. roomname (строка)
  3. user_1 (указатель на _User)
  4. user_2 (указатель на _User) ...

Я могу легко заполнить табличный вид со строковыми значениями (например, в комнате ame), но я хотел бы получить пользователей @"full name" в качестве метки каждой ячейки.

это мой код (я получаю пустой TableView):

- (PFQuery *)queryForTable { 
    PFQuery *query = [PFQuery queryWithClassName:@"Room"]; 
    [query includeKey:@"User_2"]; 

    if (self.objects.count == 0) { 
     query.cachePolicy = kPFCachePolicyCacheThenNetwork; 
    } 

    [query orderByDescending:@"createdAt"]; 

    return query; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
         object:(PFObject *)object 
{ 
    static NSString *cellIdentifier = @"Cell"; 

    PFTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
    if (!cell) { 
     cell = [[PFTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle 
             reuseIdentifier:cellIdentifier]; 
    } 

    cell.textLabel.text = object[@"fullname"]; 

    return cell; 
} 
+0

Я нашел это: http://stackoverflow.com/questions/19099137/query-with-pointer-user-in-parse-com но мне не ясно. – AJFIN

ответ

0

Когда объект указатель изначально доступен, это просто заглушки, он фактически не содержит каких-либо данных. Вы должны набрать fetchAllIfNeededInBackground:block: на них (их, чтобы сохранить эффективность), чтобы заполнить данные.

Посмотрите на подкласс контроллера табличного представления и переопределите - (void)objectsDidLoad:(NSError *)error, чтобы вызвать выборку новых объектов.

Обратите внимание, что вы можете просто изменить класс Room для кеширования имен пользователей (хотя, если вы это сделаете, вам понадобится некоторый код облака для обновления кешей, если имя пользователя изменится).

+0

Спасибо за быстрый ответ. но я не уверен, что понимаю. Не могли бы вы привести пример (его первая неделя обучения, как код), спасибо. – AJFIN

+0

Что конкретно вы не понимаете? При использовании указателей вы не получаете необходимую информацию, вам нужно сделать дополнительный запрос, чтобы получить ее. Контроллер таблицы будет получать только ваши данные объектов «Room», вам необходимо дополнительно запросить данные для пользователей, на которые они указывают. – Wain

+0

Это я понимаю, но я не уверен, как запросить дополнительные information.I попытался добавить это под запрос includeKey: ** [findObjectsInBackgroundWithBlock запрос:^(NSArray * postObjects, NSError * ошибки) ** { if (self.objects.count == 0) { query.cachePolicy = kPFCachePolicyCacheThenNetwork; } [заказ запросаByDescending: @ "createdAt"]; запрос на возврат; } ]}; Но получил ошибку: несовместимые типы указателей блоков .... – AJFIN

0

Хорошо, я решил, надеюсь, это поможет другим. Это обновленный рабочий код:

- (PFQuery *)queryForTable { 
PFQuery *query = [PFQuery queryWithClassName:@"Room"]; 
[query includeKey:@"User_2"]; 

// If no objects are loaded in memory, we look to the cache first to fill the table 
// and then subsequently do a query against the network. 
if (self.objects.count == 0) { 
    query.cachePolicy = kPFCachePolicyCacheThenNetwork; 
} 

[query orderByDescending:@"createdAt"]; 

return query; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView 
    cellForRowAtIndexPath:(NSIndexPath *)indexPath 
        object:(PFObject *)object 
{ 

static NSString *cellIdentifier = @"Cell"; 

PFTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
if (!cell) { 
    cell = [[PFTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle 
            reuseIdentifier:cellIdentifier]; 
} 



PFObject *user = object[@"User_2"]; 

[user fetchIfNeededInBackgroundWithBlock:^(PFObject *user, NSError *error) { 
    //NSLog(@"%@", user); 

    cell.textLabel.text = user[@"fullname"]; 
}]; 

return cell; 
} 

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