文档章节

移动端即使通讯

杭城小刘
 杭城小刘
发布于 2016/07/25 11:22
字数 719
阅读 9
收藏 0

    这个地方回多次提到“Qos”,不知道“Qos”的童鞋可以看看http://my.oschina.net/u/1778933/blog/717615

    一个项目需要做到轮询,提供了一个接口:高频率接口轮询查询新消息,这显然对于流量、电量都是一个很大的开销。还有的地方需要查看新主题,需要打红点,这样又提供一个新主题接口,难道又要轮询?在与接口人员讨论过后,确定了一个解决方案,所有的轮询用一个接口搞定,只不过不同的接口需要一个“类型”参数判断,ios写了一个工具,规定了几种轮询频率,有高、中、低三种轮询频率可选,当客户端轮询到新的主题、消息等时发送通知,在相应的viewController收取通知,然后处理数据源,更新UI。

.h
//
//...

#import <Foundation/Foundation.h>

static NSTimeInterval const HighMessageRequestFrequency = 3.0;
static NSTimeInterval const LowMessageRequestFrequency  = 20.0;


static NSString * const ConsultMessageStateTopicChangedNotification = @"ConsultMessageStateTopicChangedNotification";
static NSString * const ConsultMessageStateReplyChangedNotification = @"ConsultMessageStateReplyChangedNotification";
static NSString * const ConsultMessageStateVisitChangedNotification = @"ConsultMessageStateVisitChangedNotification";
static NSString * const ConsultMessageStateAssociationDocotrChangedNotification = @"ConsultMessageStateAssociationDocotrChangedNotification";

typedef NS_ENUM(NSInteger, RequestFrequency) {
    RequestFrequencyHigh = 1,
    RequestFrequencyLow     ,
    RequestFrequencyStop
};


typedef NS_ENUM(NSUInteger, HLNewMessageType) {
    HLNewMessageTopic   = 1,
    HLNewMessageReplay  = 2
};

@interface MessageManager : NSObject
+ (MessageManager *)sharedManager;

- (void)setRequestRequency:(RequestFrequency)frequency;


/**
 *  获取新消息
 *
 *  @param status  要获取的类型
 *  @param success 成功回调
 *  @param fail    失败回调
 */
-(void)getNewMessagesWithStatus:(HLNewMessageType)status success:(void (^)(id responseObject))success fail:(void (^)())fail;


-(NSArray *)getTopicsInUserDefaults;
-(void)addTopicsToUserDefaultsWithTopic:(NSArray *)topics;
-(void)removeTopicFromUserDefaultsWithID:(NSInteger)topicid;
@end


.m
//
//...

#import "MessageManager.h"
#import "AFNetPackage.h"

@interface MessageManager ()
@property (nonatomic, strong) NSTimer *timer;
@end

@implementation MessageManager
+ (MessageManager *)sharedManager{
    static dispatch_once_t once;
    static id instance;
    dispatch_once(&once, ^{
        instance = [self new];
    });
    return instance;
}

/**
 *  设置轮询的时间间隔
 *
 */
- (void)setRequestRequency:(RequestFrequency)rf {
    [self.timer invalidate];
    switch (rf) {
        case RequestFrequencyHigh:
            self.timer = [NSTimer scheduledTimerWithTimeInterval:HighMessageRequestFrequency target:self selector:@selector(requestUnreadFlag) userInfo:nil repeats:YES];
            break;
        case RequestFrequencyLow:
            self.timer = [NSTimer scheduledTimerWithTimeInterval:LowMessageRequestFrequency target:self selector:@selector(requestUnreadFlag) userInfo:nil repeats:YES];
            break;
            
        default:
            break;
    }
    
}


- (void)requestUnreadFlag {
    NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    dic[@"userid"] = LoginHuanxinId;

    [AFNetPackage getJSONWithUrl:[Consult_Base_Url stringByAppendingString:@"messages/getmessagestate"] parameters:dic success:^(id responseObject) {
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:nil];
        if ([dict[@"status"] integerValue]==200) {
            NSDictionary *messageDic = [dict[@"data"] firstObject];
            if ([messageDic[@"TopicFlag"] boolValue]) {
                [[NSNotificationCenter defaultCenter] postNotificationName:ConsultMessageStateTopicChangedNotification object:self];
            }
            if ([messageDic[@"ReplyFlag"] boolValue]) {
                [[NSNotificationCenter defaultCenter] postNotificationName:ConsultMessageStateReplyChangedNotification object:self];
            }
            if ([messageDic[@"VisitFlag"] boolValue]) {
                [[NSNotificationCenter defaultCenter] postNotificationName:ConsultMessageStateVisitChangedNotification object:self];
            }
            if ([messageDic[@"AssociationDoctorFlag"] boolValue]) {
                [[NSNotificationCenter defaultCenter] postNotificationName:ConsultMessageStateAssociationDocotrChangedNotification object:self];
            }
            
        }
    } fail:^{
        
    }];
}


-(void)getNewMessagesWithStatus:(HLNewMessageType)status success:(void (^)(id responseObject))success fail:(void (^)())fail{
    
    NSString *url = [NSString stringWithFormat:@"%@%@",Consult_Base_Url,@"messages/getnewmessages"];
    NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    dic[@"status"] = @(status);
    dic[@"userid"] = LoginHuanxinId;
    
    [AFNetPackage getJSONWithUrl:url parameters:dic success:^(id responseObject) {
        if (success) {
            success(responseObject);
        }
    } fail:^{
        
        if (fail) {
            fail();
        }
        
    }];
    
}




-(NSSet *)getTopicsInUserDefaults{

    NSMutableDictionary *newMessageDic = [NSMutableDictionary dictionaryWithDictionary:[[NSUserDefaults standardUserDefaults] objectForKey:@"newMessage"]];
    NSMutableArray *topicIDs = [NSMutableArray arrayWithArray:newMessageDic[@"topicIDs"]];
    NSMutableSet *topicIDSet = [NSMutableSet setWithArray:topicIDs];
    return [topicIDSet copy];

}

-(void)addTopicsToUserDefaultsWithTopic:(NSArray *)topics{

    NSMutableDictionary *newMessageDic = [NSMutableDictionary dictionaryWithDictionary:[[NSUserDefaults standardUserDefaults] objectForKey:@"newMessage"]];

    NSMutableSet *topicIDs = [NSMutableSet setWithArray:newMessageDic[@"topicIDs"]];
    [topicIDs addObjectsFromArray:topics];
    NSMutableArray *ntopicIDs = [NSMutableArray array];

    for (NSNumber *topicID in topicIDs) {
        [ntopicIDs addObject:topicID];
    }

    newMessageDic[@"topicIDs"] = ntopicIDs;
    [[NSUserDefaults standardUserDefaults] setObject:newMessageDic forKey:@"newMessage"];

}
-(void)removeTopicFromUserDefaultsWithID:(NSInteger)topicid{
    NSMutableDictionary *newMessageDic = [NSMutableDictionary dictionaryWithDictionary:[[NSUserDefaults standardUserDefaults] objectForKey:@"newMessage"]];

    NSSet *topicIDs = [NSSet setWithArray:newMessageDic[@"topicIDs"]];
    NSMutableArray *ntopicIDs = [NSMutableArray array];

    for (NSNumber *topicID in topicIDs) {
        if ([topicID integerValue] == topicid) {
            continue;
        }else{
            [ntopicIDs addObject:topicID];
        }
    }
    newMessageDic[@"topicIDs"] = ntopicIDs;
    [[NSUserDefaults standardUserDefaults] setObject:newMessageDic forKey:@"newMessage"];
}
@end

这样在每个vc里面设立一个收通知、设置轮询频率就不会浪费流量了。

 

© 著作权归作者所有

共有 人打赏支持
杭城小刘
粉丝 14
博文 109
码字总数 54955
作品 0
杭州
iOS工程师
pc 应用 通过 usb adb 与 android客户端通讯

这回公司要求要实现类似碗豆夹这类的与pc应用进行通讯备份通讯录,短信,应用,并对这些信息进行编辑的功能。 这里主要用到了 adb,socket,pc 应用通过 usb 联接 android 然后通过发送广播来...

梁DH
2013/05/02
0
1
移动端区块链IM即时通讯直播平台系统APP开发的技术特征

通讯其实在我们的生活中是一种在不断完善以及创新的沟通方式,传统的通讯往往有很多种网络、电话、写信等等。经过这些烟花缭乱的传统通讯方式发展到如今的IM即时通讯系统,相对来说币圈的通讯...

数字资产先生
06/12
0
0
为什么说基于TCP的移动端IM仍然需要心跳保活?

1、前言 很多人认为,TCP协议自身先天就有KeepAlive机制,为何基于它的通讯链接,仍然需要在应用层实现额外的心跳保活?本文将从移动端IM实践的角度告诉你,即使使用的是TCP协议,应用层的心...

JackJiang-
2016/09/06
712
0
奥迪坚:Mobile IP Module引领移动办公与移动客服新潮流

随着智能移动终端越来越普及,移动的应用越来越丰富,人们已经习惯将许多业务从PC终端转到移动终端完成。 4G网络已经覆盖绝大多数地域,5G将在2020年之前商用,WiFi也遍布办公、家庭甚至公共...

玄学酱
03/27
0
0
蓝牙技术原理

1.蓝牙技术原理--简介   所谓蓝牙技术,实际上是一种短距离无线通信技术,利用“蓝牙”技术,能够有效地简化掌上电脑、笔记本电脑和移动电话手机等移动通信终端设备之间的通信,也能够成功...

JlongTian
01/26
2
0

没有更多内容

加载失败,请刷新页面

加载更多

初级开发-编程题

` public static void main(String[] args) { System.out.println(changeStrToUpperCase("user_name_abc")); System.out.println(changeStrToLowerCase(changeStrToUpperCase("user_name_abc......

小池仔
今天
6
0
现场看路演了!

HiBlock
昨天
16
0
Rabbit MQ基本概念介绍

RabbitMQ介绍 • RabbitMQ是一个消息中间件,是一个很好用的消息队列框架。 • ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的s...

寰宇01
昨天
10
0
官方精简版Windows10:微软自己都看不过去了

微软宣布,该公司正在寻求解决方案,以减轻企业客户的Windows 10规模。该公司声称,企业客户下载整个Windows 10文件以更新设备既费钱又费时。 微软宣布,该公司正在寻求解决方案,以减轻企业...

linux-tao
昨天
19
0
TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
昨天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部