- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于我的 pubnub 聊天应用程序,我在本地存储了一些消息,以防止它使用大量的 wifi/数据。它似乎工作正常,但有时最后一条消息会重复。这是我的保存、加载、重新加载代码。
#pragma mark - PubNub manager methods
- (NSString *)parseMessage:(id)message
{
if ([message isKindOfClass:[NSDictionary class]]) {
NSDictionary *messageAsDict = message;
if ([[messageAsDict objectForKey:@"text"] isKindOfClass:[NSString class]]) {
NSString *messageString = [messageAsDict objectForKey:@"text"];
if (messageString || messageString.length > 0) {
return messageString;
} else {
return @"Unable To Parse Message";
}
} else {
return @"Unable To Parse Message";
}
} else if ([message isKindOfClass:[NSString class]]) {
NSString *messageString = message;
if (messageString.length > 0) {
return messageString;
} else {
return @"Unable To Parse Message";
}
} else {
return @"Unable To Parse Message";
}
}
- (void)saveObjects
{
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
NSString *messagesDirectoryPath = [docDir stringByAppendingPathComponent:@"Messaging"];
if (![[NSFileManager defaultManager] fileExistsAtPath:messagesDirectoryPath]) {
[[NSFileManager defaultManager] createDirectoryAtPath:messagesDirectoryPath withIntermediateDirectories:YES attributes:nil error:&error];
}
NSString *messagesPath = [messagesDirectoryPath stringByAppendingPathComponent:messageFile];
NSString *timeTokenPath = [messagesDirectoryPath stringByAppendingPathComponent:timeTokenFile];
NSString *timeTokenString = [NSString stringWithFormat:@"%ld", (long)lastTimeToken];
[messagesArray writeToFile:messagesPath atomically:YES];
[timeTokenString writeToFile:timeTokenPath atomically:YES encoding:NSUTF8StringEncoding error:&error];
}
- (void)loadObjects
{
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
NSString *messagesDirectoryPath = [docDir stringByAppendingPathComponent:@"Messaging"];
NSString *messagesPath = [messagesDirectoryPath stringByAppendingPathComponent:messageFile];
NSString *timeTokenPath = [messagesDirectoryPath stringByAppendingPathComponent:timeTokenFile];
messagesArray = [NSMutableArray arrayWithContentsOfFile:messagesPath];
if (!messagesArray) {
messagesArray = [[NSMutableArray alloc] init];
[self saveObjects];
}
NSString *timeTokenString = [NSString stringWithContentsOfFile:timeTokenPath encoding:NSUTF8StringEncoding error:&error];
if (![timeTokenString isEqualToString:@""]) {
lastTimeToken = [timeTokenString integerValue];
} else {
lastTimeToken = [self currentTimeToken];
[self saveObjects];
}
}
- (void)reloadMessages
{
messagesArray = [[NSMutableArray alloc] init];
//Get all the chats you missed
[self.pnClient historyForChannel:kCHAT_CHANNEL withCompletion:^(PNHistoryResult *result, PNErrorStatus *status) {
// Check whether request successfully completed or not.
if (!status.isError) {
// Handle downloaded history using:
// result.data.start - oldest message time stamp in response
// result.data.end - newest message time stamp in response
// result.data.messages - list of messages
// Get messages
for (id message in result.data.messages) {
[messagesArray addObject:[self parseMessage:message]];
}
// Set timetoken
lastTimeToken = [self parsePNTimeToken:result.data.end];
// Save stuff
[self saveObjects];
dispatch_async(dispatch_get_main_queue(), ^{
[self.messagesTable reloadData];
[self scrollToBottom];
});
} else {
// Request processing failed.
UIAlertController *errorController = [UIAlertController alertControllerWithTitle:@"Error" message:@"Could not recieve messages" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil];
UIAlertAction *retryAction = [UIAlertAction actionWithTitle:@"Retry" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
[status retry];
}];
[errorController addAction:cancelAction];
[errorController addAction:retryAction];
[self presentViewController:errorController animated:YES completion:nil];
}
}];
}
- (void)addMessage:(PNMessageResult *)message
{
[messagesArray addObject:[self parseMessage:message.data.message]];
lastTimeToken = [message.data.timetoken integerValue] + 1;
[self saveObjects];
}
- (NSInteger)parsePNTimeToken:(NSNumber *)timeToken
{
return trunc([timeToken integerValue] / pow(10, 7));
}
- (NSInteger)currentTimeToken
{
return [[NSDate date] timeIntervalSince1970];
}
- (void)updateLostMessages
{
[self.pnClient historyForChannel:kCHAT_CHANNEL start:[NSNumber numberWithInteger:lastTimeToken] end:[NSNumber numberWithInteger:[self currentTimeToken]] limit:NSIntegerMax withCompletion:^(PNHistoryResult *result, PNErrorStatus *status) {
NSArray *tempResultArray = result.data.messages;
for (id message in tempResultArray) {
[messagesArray addObject:[self parseMessage:message]];
NSLog(@"%@", [self parseMessage:message]);
}
lastTimeToken = [self currentTimeToken] + 1;
[self saveObjects];
[self loadObjects];
dispatch_async(dispatch_get_main_queue(), ^{
[self.messagesTable reloadData];
[self scrollToBottom];
});
}];
}
这些方法非常简单。 parseMessage:
从任何地方获取消息并解析要显示的文本。 saveObjects
将 timeToken 和消息保存到磁盘,并加载它们。时间标记方法只是将 PN 时间标记转换为精度较低的格式并获取当前时间标记。 updateLostMessages
获取从最后一条消息 timetoken 到当前的所有消息,而不是获取所有消息。
在 viewDidLoad
中,我调用了 [self loadObjects]
然后是 [self updateLostMessages]
问题是消息重复!帮助表示赞赏。另外,很抱歉代码太长。
最佳答案
哈哈,我傻了。我只是在重新加载方法中忘记了 + 1
。好吧,对于任何想要使用此代码在本地存储消息而不是获取所有消息的人来说,给你。此代码存储最后一条消息的时间 token (+1),并获取从 x 时间 token 到现在的所有消息。
关于ios - PubNub 本地消息重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34456369/
我们想在 Pubnub 的聊天 channel 中创建消息线程。例如,某人可以通过“创建线程”并开始聊天来响应 channel 中的特定消息。是否有规定的方法来模拟这种行为?如果是这样,您能否引用文档
我们想在 Pubnub 的聊天 channel 中创建消息线程。例如,某人可以通过“创建线程”并开始聊天来响应 channel 中的特定消息。是否有规定的方法来模拟这种行为?如果是这样,您能否引用文档
PubNub 建议“向任何一个 channel 发布消息的速度不得超过每秒 5 条消息”。我想知道 PubNub 本身是否有一些设置可以限制发布消息? 例如,我每秒向一个 channel 发布 100
我们正在使用 NodeJS 发布消息。订阅者是否可以通过电子邮件接收消息? 最佳答案 目前,PubNub 支持原生的 PubNub、GCM 和 APNS 消息端点。更多信息在这里:http://www
想象一下我们有很多生产者和一个消费者的场景。消费者订阅了一个名为“consumerGroup”的 channel 组。生产者每次进入系统,都会将 channel “Producer-ID-Channe
我正在研究 pubnub 以在 Rickshaw 的实时数据可视化中使用。但我不明白 channel 是否已经配置或者我们是否必须配置它们。如果是这样,我们如何为数据可视化配置 channel ?另外
假设相同的 uuid 是 subscribe() with channels 但他们在不同的订阅时间和来自不同的浏览器 场景 使用 Chrome 10 分钟之前 订阅 channel =>channe
我想知道从 pubnub.history 检索到的消息是谁发送的! pubnub.history() 只返回时间 token 和消息。 最佳答案 PubNub 发件人 UUID:实时与历史记录 发送者
是否可以获取与 Pubnub 订阅 key 关联的所有 channel ?使用此 key 创建的所有 channel ? 谢谢, 最佳答案 您可以使用 Global Here Now 调用 - htt
使用 PubNub Presence 功能时,是否可以提供用户加入或离开 channel 时 PubNub 调用的 HTTP 回调?就我而言,我想调用 Parse.com 云函数。澄清一下:我不想从客
我有一个特定的用例,我需要将用户的账户余额发送到他们的浏览器和/或移动设备。这些余额当然是私有(private)的,但当余额发生变化时,我需要将余额更新发送给每个连接的用户,但是,我担心会同时推送到
我有一个应用程序,每个用户必须接收仅与他们自己相关的通知。 为此,我为每个用户创建了一个唯一的 channel 名称。当用户使用 javascript 从浏览器登录时,我订阅了这个 channel 。
是否可以在 pubnub 中发布到 channel 组并接收到添加到 channel 组的所有 channel 的消息? 最佳答案 发布到 channel 组 目前不支持发布到 channel 组或多
在我的一个应用程序中,我使用 PUBNUB 进行实时网络通信。 但是我面临一些奇怪的问题,因为当我订阅一些 channel 时,window.print()(打印预览对话框未打开)根本不起作用。 如果
我正在尝试将时间戳 2016-02-11 03:31:18 转换为 17 位精度 unix 时间 (UTC) 的 pubnub 时间戳,类似于 pubnub 给出的引用 URL 中给出的 134067
PubNub 的 Eon Charts 为每条单独的 PubNub 消息查找一个 JSON 对象数据集。请参阅 git hub 上的 Eon-Chart pubnub-c3.js。 要了解可能出现的数
我正在使用 PubNub Api 和 ionic 平台创建 Whatsapp 应用程序。但是,它存在 ionic.bundle.js:21157 TypeError: PubNub.publish 不
记录每条已发布消息并将其保存到我的服务器数据库的正确方法是什么? 我能想到的有两种选择: 在发布事件后使用 PubNub 功能并将消息转发到专用的记录器 channel 。服务器将订阅 channel
我想从事与即时消息相关的个人项目。我想知道是否有像 pubnub 这样的 API 对公众开放。 谢谢 最佳答案 您可以在 http://www.pubnub.com/developers 找到所有开源
我正在努力了解如何使用 rxjs 库将以下内容转换为 observable。 var client = PUBNUB.init({ publish_key: 'pubkey', subscri
我是一名优秀的程序员,十分优秀!