引言
作為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來封裝自己需要的一套庫锰瘸。至于一些很炫的動畫庫,可以考慮用facebook的pop第三方庫昂灵,里面的動畫都不錯避凝,可以下個DEMO體驗下。