observables和UItableview可见单元格

时间:2013-11-18 22:21:57

标签: ios uitableview chat observable pubnub

我正在写一个IOS聊天应用。 我有一个tableview,其中每个单元格包含一个文本框,在加载每个单元格后,我订阅了pubnub.com上的聊天频道。我在viewdidLoad中有一个observable来观察传入的消息。从observable接收的对象包含通道名称和消息文本和日期。 我想将消息显示到适当的单元格。 我不确定在视图中捕获满载单元格的位置并订阅该通道。然后在observable中如何将频道名称与屏幕上当前视图中的单元格进行比较? 我尝试了isVisible,但我得到的不仅仅是屏幕上可见的内容。问题是我只想向当前视野中的单元格显示消息,当用户停止在该单元格上时,即使他们不点击它,藤也会开始播放视频...

见下面的代码

- (void)viewDidLoad
{
    [super viewDidLoad];

    appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
    self.messages = [NSMutableDictionary dictionary];
    self.configuration = [PNConfiguration defaultConfiguration];

    [self load_DEMO_DATA];
    [self setClient];
    [self connectToServer];

    //Observable
    [[PNObservationCenter defaultCenter] addMessageReceiveObserver:self
                                                         withBlock:^(PNMessage *message) {

        NSDateFormatter *dateFormatter = [NSDateFormatter new];
        dateFormatter.dateFormat = @"HH:mm:ss MM/dd/yy";
        PNChannel *channel = message.channel;

        NSString *messages = [self.messages valueForKey:channel.name];
        if (messages == nil) {messages = @"";}
        messages = [messages stringByAppendingFormat:@"<%@> %@\n",[dateFormatter stringFromDate:message.receiveDate.date],message.message];

        //Get TextBox & Set Caption                                                                                    
        UITextView *caption = (UITextView *)[[(UITableViewCell *)[(UITableView    *)self.tableView cellForRowAtIndexPath:CurrentIndexPath] contentView] viewWithTag:105];

        caption.text = [NSString stringWithFormat:@"%@%@", caption.text, messages];
        [caption scrollRangeToVisible:NSMakeRange([caption.text length], 0)];                         
    }];

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"TimelinePostCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell==nil)
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

    // Configure the cell...
    NSDictionary *post = [posts objectAtIndex:indexPath.item];
    NSDictionary *user = [post objectForKey:@"user"];

    //Set Current Channel
    self.currentChannel = [PNChannel channelWithName:[post objectForKey:@"channelName"]      shouldObservePresence:YES];

    //Subscribe to Chat
    [self subscribeToChannel:self.currentChannel.name];
    self.currentPost = post;

    //Get Channel History
    [self ChannelHistory];

    return cell;
}

1 个答案:

答案 0 :(得分:1)

首先,-tableView:cellForRowAtIndexPath:不应该用于启动任何耗时的操作。为了保持高性能,您应该从该方法返回准备好的 UITableViewCell ,少于160ms,否则您将看到“lag”。在显示表格后,此方法将被调用几次(与具有值的单元格一样多)。

您应该使用–scrollViewDidEndDragging:willDecelerate:(使用减速 NO)和–scrollViewDidEndDecelerating:作为适当的地点和时间,以便您开始订阅频道和任何其他操作使用 PubNub 客户端。

您可以同时订阅所有频道 - 它将比逐个订阅每个频道的网络开销更少。如果您希望通过保持客户端在少数频道上订阅来保留资源并保持低价,那么您应该使用相同的方法取消订阅以前的频道(与建议用于检测当前小区和存储当前频道等相同)。

还建议你如何用模型提供细胞:在自定义细胞类中移动模型处理(控制器没有理由知道细胞视图的结构以及应该在那里显示哪些数据)。