基于OC的簡易任務(wù)管理器

任務(wù)管理器(TaskManager)

任務(wù)管理

  • 為什么需要任務(wù)管理
  • 實現(xiàn)思路
  • 部分邏輯代碼
  • Task
  • 延伸

為什么需要任務(wù)管理

在設(shè)計router的時候我們曾希望通過類映射的方式將一些特殊的服務(wù)例如api請求遗菠,而在之后我發(fā)現(xiàn)因為task任務(wù)的生命周期問題,在model回調(diào)之前整個task都已經(jīng)被釋放了盐杂,所以我需要一個manager來負責(zé)管理這些任務(wù)驳棱,包括了任務(wù)完成之后的釋放批什。

實現(xiàn)思路

我新建了一個TaskManager的類作為管理器,考慮到我們現(xiàn)在的業(yè)務(wù)大部分頁面的點擊事件都是在這里社搅,在這里我先添加了一個ManagerDic的可變字典驻债,大致的結(jié)構(gòu)是

{key : [TASK1,TASK2]} key對應(yīng)的就是約定的類名
之后我用了KVO來進行管理,在HHTask這個類里添加了一個屬性completeTask 來做判斷 當(dāng)任務(wù)完成 將completeTask置成yes形葬,然后 移除在TaskManager里面的任務(wù)合呐,移除觀察者。

部分邏輯代碼

    首先判斷是否已經(jīng)有對應(yīng)的數(shù)組存在笙以,task任務(wù)
    完成以后remove掉自己的任務(wù)就好淌实,如果還沒有任務(wù)就生成對應(yīng)任務(wù)數(shù)組。
+ (void)addTask:(id)task key:(NSString *)key{
    HHTaskManager *manager = [HHTaskManager shared];
    @synchronized (self) {
      if (manager.managerDic[key]) {
          NSMutableArray *taskArray = manager.managerDic[key];
          [taskArray addObject:task];
        
      }
      else {
          NSMutableArray *taskArray = [NSMutableArray array];
          [taskArray addObject:task];
          [manager.managerDic setObject:taskArray forKey:key];
      }
    
      [task addObserver:manager forKeyPath:@"completeTask" options:0 context:nil];
    
       NSMethodSignature *sig= [[task class] instanceMethodSignatureForSelector:@selector(excuteTask)];

       NSInvocation *invocation=[NSInvocation invocationWithMethodSignature:sig];
    
       invocation.target = task;
      invocation.selector = @selector(excuteTask);
    
       [invocation invoke];
  }
}
    

上面這一部分任務(wù)的執(zhí)行 其實可拓展性會比較強 如果是與UI有關(guān)系的任務(wù)可以放在主線程進行,這里可以在初始化task的時候給他一個status的狀態(tài)來判斷翩伪。我們現(xiàn)在的做法是在我們的router解析完以后有一個規(guī)則依靠規(guī)則來判斷微猖。

這里利用了KVO來檢測任務(wù)完成,完成以后移除任務(wù)和觀察者

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    HHTaskManager *manager = [HHTaskManager shared];
    
    if (manager.managerDic[NSStringFromClass([object class])]) {
        NSMutableArray *taskArray = manager.managerDic[NSStringFromClass([object class])];

        [object removeObserver:manager forKeyPath:@"completeTask"];

        [taskArray removeObject:object];

    }
    
}

Task

typedef void (^TaskResult)(BOOL isSucceed, NSDictionary *userInfo);

@interface Task : NSObject
@property (nonatomic, assign) BOOL  isNeedLogin;
@property (nonatomic, copy) TaskResult        callback;
@property (nonatomic, strong)NSString  *completeTask;

- (void)initWithparam:(NSDictionary *)param;

- (void)excuteTask;

//子類實現(xiàn)方法
- (void)excuteDetailTask;

對應(yīng)的task的設(shè)計缘屹,起初想設(shè)立一定的規(guī)則模塊來完善登錄這個動作凛剥,后來還是決定增加一個屬性來判斷是否需要登錄,考慮了登錄以后有回調(diào)的需求轻姿。 預(yù)留了一個callback給一些任務(wù)完成以后需要有特殊回調(diào)的需求犁珠。completeTask是表示任務(wù)是否完成。因為考慮到 有api請求的需要等到api返回以后才是真正的完成了任務(wù)互亮。這是一個基類犁享。然后可以看一下我的其他任務(wù)子類代碼。

@interface HHWapTask : Task

@property (nonatomic, strong)NSString *url;

@end

可以看到其實不同的task任務(wù)還會分解出不同的參數(shù)豹休,在- (void)initWithparam:(NSDictionary *)param;這個方法里將你所需要的參數(shù)進行了分解炊昆。之后再執(zhí)行任務(wù)即可。

延伸

剛開始我打算做的是一個任務(wù)的存儲和管理威根,之后考慮的是一些重復(fù)的任務(wù)之間因為key 是相同的通過key我可以判斷是否直接取消這個任務(wù)凤巨,在task里面可以加一個任務(wù)是否需要啟動的開關(guān),如果發(fā)現(xiàn)任務(wù)重復(fù)就設(shè)置為不開啟洛搀,然后直接移除任務(wù)敢茁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市留美,隨后出現(xiàn)的幾起案子彰檬,更是在濱河造成了極大的恐慌,老刑警劉巖谎砾,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逢倍,死亡現(xiàn)場離奇詭異,居然都是意外死亡棺榔,警方通過查閱死者的電腦和手機瓶堕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來症歇,“玉大人,你說我怎么就攤上這事谭梗⊥睿” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵激捏,是天一觀的道長设塔。 經(jīng)常有香客問我,道長远舅,這世上最難降的妖魔是什么闰蛔? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任痕钢,我火速辦了婚禮,結(jié)果婚禮上序六,老公的妹妹穿的比我還像新娘任连。我一直安慰自己,他們只是感情好例诀,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布随抠。 她就那樣靜靜地躺著,像睡著了一般繁涂。 火紅的嫁衣襯著肌膚如雪拱她。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天扔罪,我揣著相機與錄音秉沼,去河邊找鬼。 笑死矿酵,一個胖子當(dāng)著我的面吹牛唬复,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坏瘩,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼盅抚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了倔矾?” 一聲冷哼從身側(cè)響起妄均,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哪自,沒想到半個月后丰包,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡壤巷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年邑彪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胧华。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡寄症,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矩动,到底是詐尸還是另有隱情有巧,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布悲没,位于F島的核電站篮迎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜甜橱,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一逊笆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧岂傲,春花似錦难裆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至堰乔,卻和暖如春偏化,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背镐侯。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工侦讨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苟翻。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓韵卤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親崇猫。 傳聞我的和親對象是個殘疾皇子沈条,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

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

  • 點擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 13,785評論 0 15
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)诅炉,斷路器蜡歹,智...
    卡卡羅2017閱讀 134,701評論 18 139
  • "這他媽人也太多了吧"這個身高一米八,頭發(fā)卡尺涕烧,上身山寨耐克下身大褲衩子的就是我月而,我叫王超,現(xiàn)在是一家房地產(chǎn)展會公...
    長毛的柿子閱讀 195評論 0 1
  • 鄉(xiāng)之秋 文/麥田慧子 鄉(xiāng)村永遠不會變老 房前屋后百花留艷 田間路旁百果爭香...
    大漠駝影閱讀 175評論 0 0
  • 你愛的是未來未來的我议纯, 我戀的是過去過去的你父款, 多希望時光匆匆, 成為你想象中的那個我瞻凤, 多希望時光倒流憨攒, 追回我...
    worndy閱讀 218評論 0 0