Method-Swizzling实战-实现iOS原生网络请求性能采集
生活随笔
收集整理的這篇文章主要介紹了
Method-Swizzling实战-实现iOS原生网络请求性能采集
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、方法交換實現步驟(實例方法和類方法處理邏輯類似)
1.檢查原類(要被替換方法的類)的原實例方法是否存在,如果不存在,則不交換;2.檢查新類(最終被使用的方法所在的類)的新實例方法是否存在,如果不存在,則不交換;
3.檢索原實例方法所在的真實父類,防止循環調用;
4.如果原類和新類不是一個類,則需要將新類的新實例方法添加到原類;
(1)如果添加失敗,說明該方法已經存在,則不需要再做交換;
(2)如果添加成功,需要從原類重新獲取新添加的實例方法,否則可能交換失敗。
5.將原類的新實例方法交換原類的原實例方法。
6方法交換的時機可以自己控制,確保能夠及時交換就可以。
7.關鍵方法:
class_getInstanceMethod(Class _Nullable cls, SEL _Nonnull name)
class_addMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp,?
? ? ? ? ? ? ? ? const char * _Nullable types)?
method_exchangeImplementations(Method _Nonnull m1, Method _Nonnull m2)?
二、iOS原生網絡請求交換范圍
1.NSURLConnection2.NSURLSession
三、iOS原生網絡請求交換步驟,以NSURLConnection為例,NSURLSession類似。
1.新增一個類,聲明為NSURLConnection的一個新類別。2.首先需要交換非代理方式的的請求API。
(1)NSURLConnection類有兩個:
+(NSData*)sendSynchronousRequest:(NSURLRequest*)request returningResponse:(NSURLResponse* _Nullable* _Nullable)response error:(NSError**)error;
+(void)sendAsynchronousRequest:(NSURLRequest*)request queue:(NSOperationQueue*)queue completionHandler:(void (^)(NSURLResponse* _Nullable response, NSData* _Nullable data, NSError* _Nullable connectionError)) handler;
(2)新方法如下:
+(NSData*)swizzle_sendSynchronousRequest:(NSURLRequest*)request returningResponse:(NSURLResponse* _Nullable* _Nullable)response error:(NSError **)error
{
? ? //調用原本的方法
? ? NSData *resultData = [self swizzle_sendSynchronousRequest:request returningResponse:response error:error];
? ? return resultData;
}
+(void)swizzle_sendAsynchronousRequest:(NSURLRequest*)request queue:(NSOperationQueue*)queue completionHandler:(void (^)(NSURLResponse* _Nullable swizzle_response, NSData* _Nullable swizzle_data, NSError* _Nullable swizzle_connectionError)) swizzle_handler
{
? ? //如果回調方法為空,則直接返回,不做截獲處理
? ? if (swizzle_handler == nil)
? ? {
? ? ? ? return [self swizzle_sendAsynchronousRequest:request queue:queue completionHandler:nil];
? ? }
? ??
? ? //調用原本的方法
? ? [self swizzle_sendAsynchronousRequest:request queue:queue
? ? ? ? ? ? ? ? ? ? ? ? ? ?completionHandler:^(NSURLResponse* _Nullable response, NSData* _Nullable data, NSError* _Nullable connectionError)
? ? ?{
? ? ? ? ?//回調上層
? ? ? ? ?swizzle_handler(response, data, connectionError);
? ? ?}];
}
3.代理方式發送請求的API交換
(1)交換初始化方法,并在初始化方法中獲取代理對象,并交換代理對象的網絡代理方法。
原方法:
-(NSURLConnection*)initWithRequest:(NSURLRequest*)request delegate:(nullable id)delegate startImmediately:(BOOL)startImmediately;
- (NSURLConnection*)initWithRequest:(NSURLRequest*)request delegate:(nullable id)delegate;
新方法:
-(NSURLConnection*)swizzle_initWithRequest:(NSURLRequest*)request delegate:(nullable id)delegate startImmediately:(BOOL)startImmediately
{
? ? //設置代理方法交換,交換必要的方法即可
? ? [self methodsSwizzleForDelegate:delegate];
? ? //調用原本的方法
? ? return ?[self swizzle_initWithRequest:request delegate:delegate startImmediately:startImmediately];
}
- (NSURLConnection*)swizzle_initWithRequest:(NSURLRequest*)request delegate:(nullable id)delegate
{
? ? //設置代理方法交換,交換必要的方法即可
? ? [self methodsSwizzleForDelegate:delegate];
? ??
? ? //調用原本的方法
? ? return ?[self swizzle_initWithRequest:request delegate:delegate];;
}
(2)代理方法交換,只列舉其中幾個,可以擴展
- (void)swizzle_connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
? ? //調用原本的方法
? ? [self swizzle_connection:connection didReceiveResponse:response];
}
-(void)swizzle_connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
? ? //調用原本的方法
? ? [self swizzle_connection:connection didReceiveData:data];
}
-(void)swizzle_connectionDidFinishLoading:(NSURLConnection *)connection
{
? ? //調用原本的方法
? ? [self id_swizzle_connectionDidFinishLoading:connection];
}
-(void)swizzle_connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
? ? //調用原本的方法
? ? [self id_swizzle_connection:connection didFailWithError:error];
}
四、請求性能數據采集
請求的整個過程和關鍵時機都經過我們自己的代碼,性能指標數據采集不是很簡單?總結
以上是生活随笔為你收集整理的Method-Swizzling实战-实现iOS原生网络请求性能采集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS中WebKit框架应用与解析
- 下一篇: FMDB简介