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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容