文档章节

移动端即使通讯

杭城小刘
 杭城小刘
发布于 2016/07/25 11:22
字数 719
阅读 12
收藏 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里面设立一个收通知、设置轮询频率就不会浪费流量了。

 

© 著作权归作者所有

下一篇: QoS
杭城小刘

杭城小刘

粉丝 32
博文 118
码字总数 93818
作品 0
杭州
iOS工程师
私信 提问
移动端Web 【IM】即使通讯前端模块开发

[背景] Web的即使通讯 前端JS开发。 [需求] 1.负责开发前端JS部分的工作,HTML部分我有现成的模板界面提供。 2.与后端的数据交互均采用JSON格式。并且采用Jsonp 3.跟服务端的连接性,使用轮询...

LinFree
2015/12/29
37
1
移动端 Web 【IM】即使通讯前端模块开发

[背景] Web的即使通讯 前端JS开发。 [需求] 1.负责开发前端JS部分的工作,HTML部分我有现成的模板界面提供。 2.与后端的数据交互均采用JSON格式。并且采用Jsonp 3.跟服务端的连接性,使用轮询...

LinFree
2016/01/10
9
0
移动端区块链IM即时通讯直播平台系统APP开发的技术特征

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

数字资产先生
2018/06/12
0
0
pc 应用 通过 usb adb 与 android客户端通讯

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

梁DH
2013/05/02
2.7K
1
奥迪坚:Mobile IP Module引领移动办公与移动客服新潮流

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

玄学酱
2018/03/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0
简述TCP的流量控制与拥塞控制

1. TCP流量控制 流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。 原理是通过确认报文中窗口字段来控制发送方的发送速率,发送方的发送窗口大小不能超过接收方给出窗口大小。...

鏡花水月
今天
9
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
914
11
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部