標籤:
這個問題從網路包的內容,由於保密問題,我剛才所描述我的業餘的想法。
基本的想法:
網路請求,我們應該能夠使用基類BaseNetWork, 然後由衍生類別繼承BaseNetWork,並實現一些特殊的方法。
一般標準的流程是傳入block, 當網路請求完成後。通過block回調回來。這裡敘述的關鍵不是怎樣實現一個網路請求和回調block的相關內容,而是怎樣取消請求。 一般基類會實現一個cancelNetWork方法。它依據自己的url進行cancel操作。
舉例:
我們使用 DerivedNetWork* net = [DerivedNetWork alloc]init]; 在init方法中設定了自身的url。然後調用基類的sendRequest發送請求。 等待網路返回的回調。 假設須要取消請求,難道我們使用[net CancelNetWork];,這樣肯定不好。
畢竟在其它的方法裡面不能得到當前的net指標,儲存成成員又沒有必要。 於是大家會想到應該使用類名進行cancel操作。 即將cancelNetWork定義成類方法。而不是對象方法。
這就引入了一個新的問題, 類方法怎樣擷取到對象的url? 經過苦思冥想,有一天發現了objc_setAssociatedObject方法。又聯想到類對象本身也是對象的思路,想到一個解決方式。
方案:
基類NetWork類的實現代碼:
#define LSPerson_URL_Key @"LSPerson_URL_Key"@implementation BaseNetWork-(void)setUrl:(NSString *)url{ objc_setAssociatedObject([self class], LSPerson_URL_Key, url, OBJC_ASSOCIATION_COPY_NONATOMIC);}+(void)cancelRequest{ NSString* url = objc_getAssociatedObject([self class], LSPerson_URL_Key); NSLog(@"cancelRequestUrl:%@", url);}@end上面基類有一個setUrl方法,供衍生類別的對象使用設定自身的url, 它將url綁定到self class的類對象上。 然後另一個cancelRequest類方法。它從當前類對象中讀取到url,來進行真正的cancel操作。 通過這樣的方式。衍生類別能夠使用此類方法進行自由的取消請求操作了。
代碼:
LPStudyRequest* lpReq = [[LPStudyRequest alloc]init];lpReq.url = @"http://jiawei.com";//能夠看到日誌的輸出。不同的衍生類別能夠得到不同的url。再使用此url傳遞給AF進行取消操作。[LPStudyRequest cancelRequest];
總結:
上面是一個主要的給類加入變數的思想。 它在這個取消網路請求裡面得到了非常好的應用。 我還將它用到防止自身提前釋放, 仿C++的靜態變數中。
請一定要注意: C++的靜態變數和object-c裡面用到的單例static是不一樣的。 一個是屬於類的靜態變數,一個是屬於全域程式的靜態變數。 假設基類定義了靜態變數。衍生類別繼承的話, C++的衍生類別會非常好的繼承下來。 OC的全部的衍生類別對象公有的是同一個記憶體款, 它可以考慮使用類對象,勢必類比這種情況。
著作權聲明:本文部落格原創文章,部落格,未經同意,不得轉載。
object-c計劃tips-添加到類對象屬性