PubNub本地邮件重复?

时间:2015-12-24 18:02:32

标签: ios objective-c duplicates real-time pubnub

对于我的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和消息保存到磁盘,并加载它们。 timetoken方法只是将PN时间转换为精度较低的格式并获取当前时间令牌。 updateLostMessages将所有消息从上次消息的timetoken获取到当前消息,并且不获取所有消息。

viewDidLoad我致电[self loadObjects],然后[self updateLostMessages]问题是邮件正在重复!帮助赞赏。此外,抱歉长代码。

1 个答案:

答案 0 :(得分:1)

哈哈,傻我。我刚忘了重载方法中的User Profile。好吧,对于任何想要使用此代码本地存储消息而不是获取所有消息的人,请转到此处。此代码存储最后一条消息(+1)的timetoken,并从x时间令牌到现在获取所有消息。