JJNetwork正式版發(fā)布

基于AFNetworking封裝的網(wǎng)絡(luò)庫闸氮,主要是為了滿足一些復(fù)雜App的網(wǎng)絡(luò)請求剪况,并在層次劃分上比較清新,所有的網(wǎng)絡(luò)請求是數(shù)據(jù)提供者蒲跨,還歸納了一些常見的功能封裝在里面(緩存,簽名...),設(shè)計文檔

特色功能

  • [x] 自定義Key簽名參數(shù)
  • [x] 緩存不止支持GET译断,還支持POST,根據(jù)自己的場景,自己選擇策略
  • [x] 支持用IP替換域名或悲,達(dá)到提高網(wǎng)絡(luò)性能孙咪,支持HTTP HEAD設(shè)置
  • [x] 攔截網(wǎng)絡(luò)請求堪唐,方便攔截任意請求,復(fù)用請求翎蹈,加入Loading

安裝環(huán)境

  • iOS 8.0以上
  • Xcode 7.3以上

如何安裝

Podfile

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'

target 'TargetName' do
pod 'JJNetwork'
end

執(zhí)行命令:

$ pod install

使用Carthage集成

在你的Cartfile文件里淮菠,加入以下內(nèi)容:

github "jezzmemo/JJNetwork"

AFNetworking.framework,JJNetwork.framework 兩個framework加入到自己的項目

如何使用

JJAPIRequest

每個網(wǎng)絡(luò)請求都是繼承JJAPIRequest,并按照JJRequestInput協(xié)議的方法,按照自己的需求荤堪,重寫(overwrite)指定的方法合陵,來滿足自己的需求.

下面我用JJNetwork來向http://api.imemo8.com/diary.php發(fā)送一個GET請求,參數(shù)是mod=getHotDiary:

#import "JJNetwork.h"

@interface DemoRequest : JJAPIRequest

@end

#import "DemoRequest.h"

@implementation DemoRequest

- (NSString*)requestURL{
    return @"http://api.imemo8.com/diary.php";
}

- (HTTPMethod)requestMethod{
    return JJRequestGET;
}
@end
  • requestURL
    填寫一個完整的URL澄阳,繼承JJAPIRequest的時候拥知,必須需要實現(xiàn)這個方法,其余方法都是可選的碎赢,

  • requestMethod
    返回一個枚舉類型低剔,POST,GET,PUT,DELETE,如果不實現(xiàn),默認(rèn)是GET

如何傳遞參數(shù)和調(diào)用

關(guān)于在哪初始化Request肮塞,這個根據(jù)自己的情況自己選擇户侥,你可以在ViewController里調(diào)用,也可以再自己的中間層調(diào)用峦嗤,這里給的例子是在ViewController里的例子:

#import "PresentViewController.h"
#import "DemoRequest.h"

@interface PresentViewController ()<JJRequestDelegate>

@property(nonatomic,readwrite,strong)DemoRequest* demoRequest;

@end

@implementation PresentViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self.demoRequest startRequest];
}

#pragma mark - Get property

- (DemoRequest*)demoRequest{
    if (_demoRequest != nil) {
        return _demoRequest;
    }
    _demoRequest = [DemoRequest new];
    _demoRequest.delegate = self;
    return _demoRequest;
}

#pragma mark - Request parameter

- (NSDictionary*)requestParameters:(JJAPIRequest *)request{
    return @{@"mod":@"getHotDiary"};
}

#pragma mark - Network response

- (void)responseSuccess:(JJAPIRequest *)request responseData:(id)data{
    NSLog(@"responseSuccess");
}

- (void)responseFail:(JJAPIRequest *)request errorMessage:(NSError *)error{
    NSLog(@"responseFail");
}
@end
  • 調(diào)用startRequest方法執(zhí)行網(wǎng)絡(luò)請求
  • 實現(xiàn)requestParameters來提供請求的參數(shù)蕊唐,網(wǎng)絡(luò)情況的輸入
  • responseSuccess和responseFail,網(wǎng)絡(luò)請求的輸出
  • 至于為什么選擇Delegate這種交互方式,傳送門

使用自定義Key簽名參數(shù),示例如下:

- (NSString*)signParameterKey{
    return @"key";
}

如果使用了signParameterKey方法烁设,就會產(chǎn)生兩個參數(shù)signtimestamp,并且實現(xiàn)的方式是:md5(parameters + timestamp + key)

GET和POST都支持緩存,示例如下:

- (HTTPCachePolicy)requestCachePolicy{
    return ReloadFromCacheTimeLimit;
}

- (NSUInteger)cacheLimitTime{
    return 120;
}

如果選擇了ReloadFromCacheTimeLimit緩存策略替梨,就必須實現(xiàn)cacheLimitTime方法,作用是你的緩存持續(xù)的時間,過期后將從網(wǎng)絡(luò)上重新請求装黑,選擇其他兩種則不需要實現(xiàn)cacheLimitTime

  • ReloadFromNetwork: 只從網(wǎng)絡(luò)獲取
  • ReloadFromCacheElseLoadNetwork: 有緩存就從緩存獲取副瀑,沒有就從網(wǎng)路獲取
  • ReloadFromCacheTimeLimit: 緩存限定的時間范圍內(nèi)

支持用IP替換域名(服務(wù)器要支持IP訪問),達(dá)到提高網(wǎng)絡(luò)性能恋谭,支持HTTP HEAD設(shè)置

  • JJAPIDominIPModule
@interface DomainModule : NSObject<JJAPIDominIPModule>

@end
@implementation DomainModule
- (NSDictionary*)domainIPData{
    return @{@"api.imemo8.com":@"218.244.140.1"};
}
@end
  • JJAPIHttpHeadModule
@interface HttpHeadModule : NSObject<JJAPIHttpHeadModule>

@end
@implementation HttpHeadModule

- (NSDictionary*)customerHttpHead{
    return @{@"user-token":@"xxxxx",@"device-id":@"xxxxx"};
}

@end

并注冊到JJAPIRequest+Extension

[JJAPIRequest registerDomainIP:[[DomainModule alloc] init]];
[JJAPIRequest registerHttpHeadField:[[HttpHeadModule alloc] init]];

這是兩個設(shè)置的接口糠睡,DomainModule是將域名替換成IP,減少了DNS的時間疚颊,從而提高訪問速度.

HttpHeadModule是設(shè)置全局的Head Field,根據(jù)自己的項目需要來決定是否需要設(shè)置.

攔截器的使用

  • JJAPIRequest實例化對象的requestInterseptor的屬性狈孔,并實現(xiàn)JJRequestInterseptor協(xié)議:
- (DemoRequest*)demoRequest{
    if (_demoRequest != nil) {
        return _demoRequest;
    }
    _demoRequest = [DemoRequest new];
    _demoRequest.delegate = self;
    _demoRequest.requestInterseptor = self;
    return _demoRequest;
}
  • JJAPIService 的擴(kuò)展實現(xiàn)以下方法,可以監(jiān)聽任意JJAPIService子類:
+ (void)addRequestInterseptor:(id<JJRequestInterseptor>)interseptor forRequestClass:(Class)className;
+ (void)removeRequestInterseptor:(id<JJRequestInterseptor>)interseptor forRequestClass:(Class)className;

使用示例:

[JJAPIService addServiceInterseptor:self forServiceClass:[DemoAPIService class]];

- (void)beforeRequest:(JJAPIRequest*)request{
    NSLog(@"網(wǎng)絡(luò)發(fā)送Request執(zhí)行前");
}

- (void)afterRequest:(JJAPIRequest*)request{
    NSLog(@"網(wǎng)絡(luò)發(fā)送Request執(zhí)行后");
}

- (void)request:(JJAPIRequest*)request beforeResponse:(id)data{
    NSLog(@"返回結(jié)果前");
}

- (void)request:(JJAPIRequest*)request afterResponse:(id)data{
    NSLog(@"返回結(jié)果后");
}

主要應(yīng)用的兩個場景就是Loading的顯示和關(guān)閉,還有就是如果我需要用某個網(wǎng)絡(luò)請求的數(shù)據(jù)材义,不需要改動原來的業(yè)務(wù)邏輯均抽,只需要添加一份攔截即可,對已有的代碼不需要任何改動.

https://github.com/jezzmemo/JJNetwork

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末其掂,一起剝皮案震驚了整個濱河市油挥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖深寥,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件攘乒,死亡現(xiàn)場離奇詭異,居然都是意外死亡惋鹅,警方通過查閱死者的電腦和手機(jī)持灰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來负饲,“玉大人,你說我怎么就攤上這事喂链》凳” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵椭微,是天一觀的道長洞坑。 經(jīng)常有香客問我,道長蝇率,這世上最難降的妖魔是什么迟杂? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮本慕,結(jié)果婚禮上排拷,老公的妹妹穿的比我還像新娘。我一直安慰自己锅尘,他們只是感情好监氢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著藤违,像睡著了一般浪腐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顿乒,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天议街,我揣著相機(jī)與錄音,去河邊找鬼璧榄。 笑死特漩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的骨杂。 我是一名探鬼主播拾稳,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼腊脱!你這毒婦竟也來了访得?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悍抑,沒想到半個月后鳄炉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搜骡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年拂盯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片记靡。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡谈竿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出摸吠,到底是詐尸還是另有隱情空凸,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布寸痢,位于F島的核電站呀洲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏啼止。R本人自食惡果不足惜道逗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望献烦。 院中可真熱鬧滓窍,春花似錦、人聲如沸巩那。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拢操。三九已至锦亦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間令境,已是汗流浹背杠园。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舔庶,地道東北人抛蚁。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像惕橙,于是被迫代替她去往敵國和親瞧甩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理弥鹦,服務(wù)發(fā)現(xiàn)肚逸,斷路器爷辙,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中。朦促。膝晾。 其實如果沒有APIManager這一層是沒法使用delegate的,畢竟多個單...
    yhtang閱讀 5,192評論 1 23
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,124評論 25 707
  • 不記得現(xiàn)在哪里聽到或者看到過這句話:你吃第五個饅頭覺得飽了务冕,不能說前四個都白吃了血当。 之前看的張滿勝的書,同學(xué)介紹...
    忽爾今至閱讀 244評論 0 0
  • 我形容不了青春它是個什么樣子禀忆,我也給不了青春任何有關(guān)的定義臊旭,但是總覺得它悲傷著快樂著,于是如果非要用什么來形容...
    生命不設(shè)限閱讀 233評論 0 0