iOS 開發(fā)必備第三方庫(no重復(fù)造輪子)

引言

作為iOS開發(fā)人員,在開發(fā)App的過程中一般都會使用第三方庫娱据,相信很少有App是不使用第三方庫的蚪黑,因為我們要留著時間去造車了,下面是個人總結(jié)的一些常用的第三方庫和使用方法中剩。

網(wǎng)絡(luò)庫

說到網(wǎng)絡(luò)庫忌穿,這應(yīng)該是開發(fā)必備了,除非你的App想玩單機〗崽洌現(xiàn)在特別火也特別好用的網(wǎng)絡(luò)庫應(yīng)該數(shù)AFNetworking了掠剑。至于怎么導(dǎo)入第三方庫,現(xiàn)在一般都是支持CocoaPods導(dǎo)入郊愧,可以參考iOS 開發(fā)進階整理(持續(xù)更新...)這篇文章朴译。
下面是個人利用AFNetworking(基于2.0版本)封裝的一套POST請求接口:
DataRequest.h文件
#import <Foundation/Foundation.h>

typedef void(^Success)(id responseObject);
typedef void(^Failure)(id error);

@interface DataRequest : NSObject 
/**
*  POST請求接口
*
*  @param url          地址
*  @param params       要傳遞的參數(shù)
*  @param successBlock 請求成功后的回調(diào)Block
*  @param failureBlock 請求失敗后的回調(diào)Block
*/
+ (void)requestPostUrl:(NSString *)url params:(NSDictionary *)params success:(Success)successBlock failure:(Failure)failureBlock;

@end

DataRequest.m文件
#import "DataRequest.h"
#import "AFNetworking.h"

@implementation DataRequest

#pragma mark - POST請求接口
+ (void)requestPostUrl:(NSString *)url params:(NSDictionary *)params success:(Success)successBlock failure:(Failure)failureBlock{

NSLog(@"網(wǎng)址:%@\n 傳入?yún)?shù):%@", url, params);
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[manager.requestSerializer setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
//將null變成nil值,防止crash
((AFJSONResponseSerializer *)manager.responseSerializer).removesKeysWithNullValues = YES;

[manager POST:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject){
    
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    
    NSLog(@"返回的數(shù)據(jù):%@", responseObject);
    successBlock(responseObject);
    
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    NSLog(@"error:%@", error);
    failureBlock(error);
}];
}
@end

數(shù)據(jù)庫

并不是每個App都會使用到數(shù)據(jù)庫属铁,但是如果需要使用數(shù)據(jù)庫眠寿,我們一般還是會使用第三方的或者自己根據(jù)底層C語言的數(shù)據(jù)庫API封裝一套。至于CoreData那是仁者見仁焦蘑,智者見智了盯拱,個人覺得不是很好用,比較推薦使用第三方的fmdb例嘱。
至于fmdb的用法可以參考這篇文章 iOS學(xué)習(xí)筆記(十六)——數(shù)據(jù)庫操作(使用FMDB)

模型與字典互轉(zhuǎn)

這個基本上也是開發(fā)必備了狡逢,因為如果每次網(wǎng)絡(luò)請求成功,取出數(shù)據(jù)后再一個個解析取出來真的很繁瑣很低效率拼卵,這里推薦的庫就是MJExtension奢浑。這個庫簡單易用,直接看文檔就明白怎么用了腋腮。
個人也粗略看了一下其實現(xiàn)代碼雀彼,其核心就是利用runtime來完成模型與字典的互轉(zhuǎn)。在此也貼一段MJExtension的源碼(模型轉(zhuǎn)字典):
#pragma mark - 公共方法
+ (NSMutableArray *)properties
{
NSMutableArray *cachedProperties = [self dictForKey:&MJCachedPropertiesKey][NSStringFromClass(self)];`

if (cachedProperties == nil) {
    cachedProperties = [NSMutableArray array];
    
    [self mj_enumerateClasses:^(__unsafe_unretained Class c, BOOL *stop) {
        // 1.獲得所有的成員變量
        unsigned int outCount = 0;
        objc_property_t *properties = class_copyPropertyList(c, &outCount);
        
        // 2.遍歷每一個成員變量
        for (unsigned int i = 0; i<outCount; i++) {
            MJProperty *property = [MJProperty cachedPropertyWithProperty:properties[i]];
            // 過濾掉系統(tǒng)自動添加的元素
            if ([property.name isEqualToString:@"hash"]
                || [property.name isEqualToString:@"superclass"]
                || [property.name isEqualToString:@"description"]
                || [property.name isEqualToString:@"debugDescription"]) {
                continue;
            }
            property.srcClass = c;
            [property setOriginKey:[self propertyKey:property.name] forClass:self];
            [property setObjectClassInArray:[self propertyObjectClassInArray:property.name] forClass:self];
            [cachedProperties addObject:property];
        }
        
        // 3.釋放內(nèi)存
        free(properties);
    }];
    
    [self dictForKey:&MJCachedPropertiesKey][NSStringFromClass(self)] = cachedProperties;
}

return cachedProperties;
}

這個方法是在NSObject+MJProperty.m中低葫,其主要作用就是獲取類的成員變量详羡。通過調(diào)用<objc/runtime.h>中的class_copyPropertyList方法來獲取類的所有成員變量,再篩選掉幾個繼承于NSObject的類都會有的這幾個屬性(比如description嘿悬,superclass等)实柠,最后將這些篩選后的成員變量存到數(shù)組里返回。

圖片下載

現(xiàn)在的圖片下載和緩存一般就用SDWebImage這個第三方庫就好了善涨,相關(guān)API可以查看其README窒盐,也可以參考這篇文章最新版SDWebImage的使用草则。

提示HUD

說到這個提示HUD,很多人都非常喜歡MBProgressHUD蟹漓。但是炕横,個人不太喜歡它,因為使用起來很麻煩葡粒,需要實例化份殿,然后指定其屬性等等。個人更推薦的是SVProgressHUD嗽交,以單例形式存在卿嘲,任何時候直接調(diào)用,而且我們調(diào)用的API都是類方法夫壁,直接調(diào)用即可拾枣。個人也基于SVProgressHUD上修改了一套SVProgressHUD(加載時去掉指示器)。

自動布局

對于開發(fā)是使用xib/Storyboard的同學(xué)可跳過盒让。這里介紹的是純代碼的自動布局梅肤,原生的代碼自動布局是相當(dāng)困難的,寫起來很麻煩而且也很難記住邑茄。因此姨蝴,我們需要一個第三方庫對原生的約束API封裝成簡單易用的接口給我們使用。個人推薦Masonry撩扒,用法可以參考其README似扔,也可以參考這篇文章Masonry介紹與使用實踐:快速上手Autolayout

下拉刷新

到目前為止搓谆,很多公司的App一般都采用了MJRefresh這個快速集成下拉刷新和上拉加載更多功能的第三方庫。這個庫還支持自定義樣式豪墅,因此可根據(jù)需求自定義風(fēng)格泉手,用法查看其README就可以了。
個人在最初使用時偶器,會遇到在網(wǎng)絡(luò)請求過程中連續(xù)刷新會crash的bug斩萌,然而這個bug又不是每次能復(fù)現(xiàn),后調(diào)式才發(fā)現(xiàn)原來是因為有時網(wǎng)絡(luò)不是很好屏轰,會導(dǎo)致請求的數(shù)據(jù)沒有及時返回存到數(shù)組里颊郎,導(dǎo)致cell上的model去取數(shù)據(jù)時取到的為空從而crash掉。解決辦法就是在創(chuàng)建cell的cellForRowAtIndexPath方法里面判斷數(shù)組是否為空霎苗,如果是空直接返回cell姆吭,如果不為空就把數(shù)組里的model賦給cell上面的model。

結(jié)語

其實優(yōu)秀的第三方庫還有很多唁盏,但一般的App開發(fā)基本用上面的就夠了内狸,個人也不推崇一個項目里面用太多的第三方庫检眯,因為用太多會顯得這個App有點臃腫。推崇自己根據(jù)項目需求昆淡,利用Apple提供的原生API來封裝自己需要的一套庫锰瘸。至于一些很炫的動畫庫,可以考慮用facebookpop第三方庫昂灵,里面的動畫都不錯避凝,可以下個DEMO體驗下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末眨补,一起剝皮案震驚了整個濱河市管削,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渤涌,老刑警劉巖佩谣,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異实蓬,居然都是意外死亡茸俭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門安皱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來调鬓,“玉大人,你說我怎么就攤上這事酌伊√谖眩” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵居砖,是天一觀的道長虹脯。 經(jīng)常有香客問我,道長奏候,這世上最難降的妖魔是什么循集? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮蔗草,結(jié)果婚禮上咒彤,老公的妹妹穿的比我還像新娘。我一直安慰自己咒精,他們只是感情好镶柱,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著模叙,像睡著了一般歇拆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天查吊,我揣著相機與錄音谐区,去河邊找鬼。 笑死逻卖,一個胖子當(dāng)著我的面吹牛宋列,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播评也,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼炼杖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了盗迟?” 一聲冷哼從身側(cè)響起坤邪,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎罚缕,沒想到半個月后艇纺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡邮弹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年黔衡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腌乡。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡盟劫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出与纽,到底是詐尸還是另有隱情侣签,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布急迂,位于F島的核電站影所,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏僚碎。R本人自食惡果不足惜型檀,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望听盖。 院中可真熱鬧,春花似錦裂七、人聲如沸皆看。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腰吟。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間毛雇,已是汗流浹背嫉称。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留灵疮,地道東北人织阅。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像震捣,于是被迫代替她去往敵國和親荔棉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

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