iOS 實現(xiàn)頁面統(tǒng)計功能的DEMO

?????? 前段時間公司開始禁止使用第三方sdk秽褒,這對于程序猿的我來說無疑是一次毀滅性的打擊斜做,開發(fā)時間變得無可估量了柄错,其中分配到我名下的任務(wù)就是要仿造友盟數(shù)據(jù)統(tǒng)計收集這個功能埃碱,這個東西說難不難嚎尤,說簡單不簡單荔仁,數(shù)據(jù)統(tǒng)計肯定要求數(shù)據(jù)的準(zhǔn)確性,首先要完成的是統(tǒng)計頁面使用這個模塊芽死。今天這里就說說統(tǒng)計頁面使用這個模塊的思路乏梁,同時附上代碼,由于開發(fā)時間緊迫关贵,代碼的封裝性簡潔性不那么強遇骑,重在理解思路,沒有思路就不可能實現(xiàn)業(yè)務(wù)邏輯揖曾。

? ? ??? 首先要搞明白一點落萎,數(shù)據(jù)收集的目的說白了就是更加深入了解用戶習(xí)慣和用戶行為亥啦,通過分析這些數(shù)據(jù)能更好的理解用戶意圖,從而改進提高產(chǎn)品的質(zhì)量练链。大數(shù)據(jù)的時代翔脱,沒有統(tǒng)計數(shù)據(jù)這塊的產(chǎn)品肯定會落伍。

???????? 下面直接正題不廢話媒鼓,進入頁面使用統(tǒng)計這個模塊正題届吁。

???????? 需求:用戶每進入一個頁面就需要對該次操作進行記錄,包括頁面(ViewController)的title, 上一個頁面(LastViewController)的title,進入該頁面的時間等等字段需要記錄绿鸣。

? ? ? ? 思路:首先要進行準(zhǔn)確的統(tǒng)計疚沐,必須要先了解控制器(ViewController)的生命周期,生命周期有按照以下順序進行調(diào)用:

當(dāng)一個視圖控制器被創(chuàng)建枚驻,并在屏幕上顯示的時候濒旦。 代碼的執(zhí)行順序

1、 alloc ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 創(chuàng)建對象再登,分配空間

2尔邓、init (initWithNibName) 初始化對象,初始化數(shù)據(jù)

3锉矢、loadView ? ? ? ? ? ? ? ? ? ? ? ? ?從nib載入視圖 梯嗽,通常這一步不需要去干涉。除非你沒有使用xib文件創(chuàng)建視圖

4沽损、viewDidLoad ? ? ? ? ? ? ? ? ? 載入完成灯节,可以進行自定義數(shù)據(jù)以及動態(tài)創(chuàng)建其他控件

5、viewWillAppear ? ? ? ? ? ? ?視圖將出現(xiàn)在屏幕之前绵估,馬上這個視圖就會被展現(xiàn)在屏幕上了

6炎疆、viewDidAppear ? ? ? ? ? ? ? 視圖已在屏幕上渲染完成

當(dāng)一個視圖被移除屏幕并且銷毀的時候的執(zhí)行順序,這個順序差不多和上面的相反

1国裳、viewWillDisappear ? ? ? ? ? ?視圖將被從屏幕上移除之前執(zhí)行

2形入、viewDidDisappear ? ? ? ? ? ? 視圖已經(jīng)被從屏幕上移除,用戶看不到這個視圖了

3缝左、dealloc ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 視圖被銷毀亿遂,此處需要對你在init和viewDidLoad中創(chuàng)建的對象進行釋放

那么問題就來了,我們需要對頁面進行準(zhǔn)確的統(tǒng)計渺杉,那么我們記錄控制器被使用的方法必須寫在唯一的系統(tǒng)API里面蛇数,那么首先就可以把viewWillAppear、viewWillDisappear 排除在外是越,明顯這兩個方法不符合我們的需求耳舅,因為控制器無論調(diào)用viewDidLoad 還是從上級頁面調(diào)popViewControllerAnimated 這個方法,當(dāng)前頁面都會調(diào)用viewWillAppear這個函數(shù)倚评,這就會導(dǎo)致我們統(tǒng)計頁面的數(shù)據(jù)不準(zhǔn)確挽放。那么再回到上面幾個方法里看绍赛,alloc init更不可能,這些方法只是讓控制器在系統(tǒng)中分配內(nèi)存并初始化辑畦,并不適合寫入我們記錄控制器的操作吗蚌,至于loadview這個方法也不太現(xiàn)實,特別是純代碼構(gòu)建視圖的童鞋纯出,更加要排除在外蚯妇,那么只剩下viewDidLoad、viewDidDisappear暂筝、dealloc這三個方法適合我們?nèi)懭胛覀兿胍涗浛刂破鞅皇褂糜涗浀拇a了箩言,這里我選擇了viewDidLoad、dealloc這兩個方法里做文章焕襟,原因很簡單陨收,這兩個函數(shù)在整個控制器的生命周期百分百的只會被調(diào)用一次,不可能再多鸵赖,那就滿足了我們的需求了务漩。好了,首先我們明確了我們該在哪個系統(tǒng)方法里去做文章了它褪,接下來就是解決怎么做文章的問題了饵骨。

?????? 每個控制器都要統(tǒng)計被使用的次數(shù),那么這里我們要盡可能的去把通用的東西提煉出來茫打,確保效率居触。我們首先統(tǒng)計每個控制器被初始化時候的數(shù)據(jù)(生成這個頁面的數(shù)據(jù)記錄),這里我創(chuàng)建了一個管理類老赤,當(dāng)然是個單例轮洋,代碼如下


PageCollectionManger.h

@interface PageCollectionManger : NSObject

- (void)viewControllerDidLoadByController:(BaseViewController *)currentController andPageName:(NSString*)pageName;

+(instancetype)sharedInstance;

@end

PageCollectionManger.m

@implementation PageCollectionManger {

}

static PageCollectionManger *manger = nil;

+(instancetype)sharedInstance {

return [[self alloc] init];

}

- (instancetype)init {

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

manger = [super init];

});

return manger;

}

+(instancetype)allocWithZone:(struct _NSZone *)zone{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

manger = [super allocWithZone:zone];

});

return manger;

}

- (void)viewControllerDidLoadByController:(BaseViewController *)currentController andPageName:(NSString*)pageName{

NSMutableArray *array = [NSMutableArray arrayWithCapacity:0];

for (UIViewController *controller in currentController.navigationController.viewControllers) {

[array addObject:controller];

}

NSString *str = @"";

UIViewController *vc = [[UIViewController alloc] init];

if (array.count>=2) {

vc = array[array.count-2];

str = vc.title;

}

NSLog(@“l(fā)astPage—%@“,str);

NSLog(@“currentPage—%@“,currentController.title);

}

@end



然后我們只需要在每個控制器的viewDidLoad方法里面調(diào)一句代碼就可以記錄當(dāng)前控制器和上級控制器了,代碼如下:

[[PageCollectionManger sharedInstance] viewControllerDidLoadByController:self andPageName:self.tilte];

注意:這句代碼要在你設(shè)置完控制器的title后調(diào)用L1子琛!嚷狞!

到這里我們的工作只完成了一半块促,我們不能只管生荣堰,不管死床未。

關(guān)于控制器的銷毀怎么去記錄:一般我們在項目里頭, 所有的控制器都會繼承自一個BaseViewController這玩意振坚,那么當(dāng)然我們要在這個父類里去做手腳了薇搁,下面我把我寫的BaseViewController的代碼粘貼出來,這里只需要在delloc方法里去做文章渡八,因為每一個控制器的銷毀意味著返回到上一級的控制器了啃洋,所以對于上一級控制器來說传货,當(dāng)前控制器就是LastViewController,而上一級控制器只需要遍歷當(dāng)前所有的控制器取索引為array.count-2即可。


BaseViewController.m

- (void)dealloc{

//pop的邏輯

[self gogogo];

NSLog(@"返回上一個頁面");

}

- (void)gogogo {

NSMutableArray *array = [NSMutableArray arrayWithCapacity:0];

for (UIViewController *controller in self.navigationController.viewControllers) {

[array addObject:controller];

}

NSString *str = @"";

UIViewController *vc = [[UIViewController alloc] init];

if (array.count>=2) {

vc = array[array.count-2];

str = vc.title;

}

NSLog(@"lastPage---%@",self.title);

NSLog(@"currentPage----%@",str);

}

因為每次控制器在調(diào)用popViewControllerAnimated之后就會調(diào)用dealloc,也可以理解為當(dāng)返回上一級頁面時我就把上一級頁面的currentpage和lastpage兩個字段給記錄下來宏娄。

到這里 我們就能完整的保證了每個頁面在用戶的使用中顯示一次記錄一次问裕,保證了準(zhǔn)確性,時間有限孵坚,肯定有不少疏漏之處粮宛,這僅僅是給和我一樣遭遇的童鞋一個思路,如有錯誤請指正卖宠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末巍杈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扛伍,更是在濱河造成了極大的恐慌筷畦,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刺洒,死亡現(xiàn)場離奇詭異鳖宾,居然都是意外死亡,警方通過查閱死者的電腦和手機作媚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門攘滩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纸泡,你說我怎么就攤上這事漂问。” “怎么了女揭?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵蚤假,是天一觀的道長。 經(jīng)常有香客問我吧兔,道長磷仰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任境蔼,我火速辦了婚禮灶平,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘箍土。我一直安慰自己逢享,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布吴藻。 她就那樣靜靜地躺著瞒爬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侧但,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天矢空,我揣著相機與錄音,去河邊找鬼禀横。 笑死屁药,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的柏锄。 我是一名探鬼主播者祖,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绢彤!你這毒婦竟也來了七问?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤茫舶,失蹤者是張志新(化名)和其女友劉穎械巡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饶氏,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡讥耗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了疹启。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片古程。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖喊崖,靈堂內(nèi)的尸體忽然破棺而出挣磨,到底是詐尸還是另有隱情,我是刑警寧澤荤懂,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布茁裙,位于F島的核電站,受9級特大地震影響节仿,放射性物質(zhì)發(fā)生泄漏晤锥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一廊宪、第九天 我趴在偏房一處隱蔽的房頂上張望矾瘾。 院中可真熱鬧,春花似錦箭启、人聲如沸壕翩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽戈泼。三九已至,卻和暖如春赏僧,著一層夾襖步出監(jiān)牢的瞬間大猛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工淀零, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挽绩,地道東北人。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓驾中,卻偏偏與公主長得像唉堪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肩民,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,922評論 2 361

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

  • *7月8日上午 N:Block :跟一個函數(shù)塊差不多唠亚,會對里面所有的內(nèi)容的引用計數(shù)+1,想要解決就用__block...
    炙冰閱讀 2,493評論 1 14
  • 祖宗的牌位下是長不出蓮花來的持痰≡钏眩——胡說八道的我語 眾所周知,中國是一個具有五千年歷史的文明古國(盡管國外史學(xué)界也有...
    巴圖魯閱讀 559評論 14 16
  • 今天工窍、我站在陽臺上割卖、 沐浴在陽光里、 感受著風(fēng)的流動患雏、 寒...
    璇軼閱讀 130評論 0 0
  • 聽南音淹仑,像偶遇一位故人丙挽。話還不及說,過往幕幕一幀一幀閃過匀借,如老電影取试,如抽屜深處泛黃的相冊。 有些物件可以留住時間怀吻。...
    生活戀情閱讀 431評論 0 0