跟進(jìn)項(xiàng)目發(fā)現(xiàn)的小問題
這兩天再跟進(jìn)小需求,正好趕上項(xiàng)目要重構(gòu)器钟,記錄一下小細(xì)節(jié)……
應(yīng)用前后臺(tái)標(biāo)記
typedef NS_ENUM(NSInteger, UIApplicationState) {
UIApplicationStateActive,
UIApplicationStateInactive,
UIApplicationStateBackground
} NS_ENUM_AVAILABLE_IOS(4_0);
就可以記錄App的狀態(tài)津坑,不用在Appdelegate里面做各種標(biāo)記,比如:
@interface AppDelegate ()
@property (nonatomic, getter=isForeground) BOOL foreground;
此處使用foreground
來標(biāo)記應(yīng)用是否在前后臺(tái)傲霸,然后當(dāng)應(yīng)用前后臺(tái)切換的時(shí)候設(shè)施這個(gè)bool
***本地化存儲(chǔ)****
使用 NSUserDefaults
應(yīng)該單獨(dú)寫一個(gè)類疆瑰,全局都從這個(gè)類去存儲(chǔ)眉反。
現(xiàn)在隨便寫隨便調(diào)用,命名也不規(guī)范穆役,有使用宏來定義key,有使用static
來定義key. NSUserDefaults 本質(zhì)是一個(gè)plist,所以不應(yīng)該存儲(chǔ)image這樣子的大數(shù)據(jù)寸五。
內(nèi)存存儲(chǔ),也應(yīng)該全局統(tǒng)一提供接口耿币,比如使用NSCache
或者NSDictionery
UIAlertView
因?yàn)楫a(chǎn)品近期提出了很多類似于 UIAlertView 彈出順序的問題梳杏,比如:要連著彈出很多個(gè)UIAlertView,但是他們都在不同的模塊淹接,但是有優(yōu)先級十性,觸發(fā)的時(shí)機(jī)有可能是通知有可能是用戶操作等等。
類似前面的東東塑悼,UIAlertView 的彈出也應(yīng)該全局統(tǒng)一處理劲适,做一個(gè)隊(duì)列,提供先進(jìn)先出厢蒜,和優(yōu)先級的彈出策略霞势。
觸摸狀態(tài)欄兼砖,UIScrollView滾動(dòng)到頂部的策略
不應(yīng)該在 appdelegate中重寫如下方法
#pragma mark - StatusBar
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
CGPoint location = [[[event allTouches] anyObject] locationInView:[self window]];
CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame;
if (CGRectContainsPoint(statusBarFrame, location)) {
[[NSNotificationCenter defaultCenter] postNotificationName:ptv_notificationStatusBarTappedKey object:nil];
}
}
然后在有 UIScrollView 或者 UIScrollView子類的頁面中監(jiān)聽通知去實(shí)現(xiàn)苗膝,如果一個(gè)頁面的 UIScrollView 太多问慎,導(dǎo)致點(diǎn)擊狀態(tài)欄沒有辦法滾動(dòng)到頂部刁卜,應(yīng)該去實(shí)現(xiàn) UIScrollView的代理方法。
比如:
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView {
if ([_outerDelegate respondsToSelector:_cmd]) {
return [_outerDelegate scrollViewShouldScrollToTop:scrollView];
}
return YES;
}
不需要滾動(dòng)的view返回NO,一個(gè)頁面保證一個(gè) UIScrollView 足矣]赫掂僵!
SDWebImage使用問題
- (void)configSDWebimage {
/**
* 由于遠(yuǎn)程圖片為高分辨率豌熄,為了減少內(nèi)存大量飆升嘱巾,加入非解壓的方法來控制嘴纺,限制緩存
*/
[[SDWebImageDownloader sharedDownloader] setShouldDecompressImages:NO];
圖片下載后在非主線程解壓然后展示在主線程是優(yōu)化流暢度的一個(gè)重要手法,這也是sd設(shè)置這個(gè)默認(rèn)為YES的重要原因浓冒。
吧啦吧啦,圖片高分辨率尖坤,遠(yuǎn)程……應(yīng)該能知道哪些頁面是所謂高分辨率稳懒,然后單獨(dú)做設(shè)置。慢味。
比如:
1场梆、首先在封裝的控制器中定義變量用于存儲(chǔ)原設(shè)置:
static BOOL SDImageCacheOldShouldDecompressImages = YES;
static BOOL SDImagedownloderOldShouldDecompressImages = YES;
2、loadView中保存原設(shè)置并且禁用解壓縮:
SDImageCache *canche = [SDImageCache sharedImageCache];
SDImageCacheOldShouldDecompressImages = canche.shouldDecompressImages;
canche.shouldDecompressImages = NO;
SDWebImageDownloader *downloder = [SDWebImageDownloader sharedDownloader];
SDImagedownloderOldShouldDecompressImages = downloder.shouldDecompressImages;
downloder.shouldDecompressImages = NO;
3纯路、dealloc中恢復(fù)原設(shè)置:
-(void)dealloc {
SDImageCache *canche = [SDImageCache sharedImageCache];
canche.shouldDecompressImages = SDImageCacheOldShouldDecompressImages;
SDWebImageDownloader *downloder = [SDWebImageDownloader sharedDownloader];
downloder.shouldDecompressImages = SDImagedownloderOldShouldDecompressImages;
}
蘋果也有給出高清大圖的Demo. Large Image Downsizing
總之或油,不應(yīng)該為了預(yù)防性節(jié)省內(nèi)存,犧牲流暢度等用戶體驗(yàn)驰唬。
集中打點(diǎn)的問題
現(xiàn)在項(xiàng)目中的打點(diǎn)如下方式
[[DDStatistics sharedInstance] remindDDMessageID:dictionary[@"push_id"]
roomID:roomId
Status:@"3"];
DDStatistics
這個(gè)模塊在整個(gè)項(xiàng)目中有飄來飄去顶岸,建議引入切面編程的方式使用配置文件打點(diǎn)腔彰,比如引入 aspect
.
某日,產(chǎn)品經(jīng)理讓我找找某個(gè)點(diǎn)在哪里打的辖佣,比如霹抛,10086這個(gè)點(diǎn)是哪里的,我就這樣子卷谈,全局搜索10086杯拐,我擦,木有世蔗,算了全局搜索 DDStatistics 我擦端逼,還是木有,最后各種排查污淋,發(fā)現(xiàn)是傳入的某個(gè)函數(shù)的參數(shù)顶滩。巴拉巴拉。芙沥。诲祸。
關(guān)于get函數(shù)的職責(zé)
get函數(shù),我覺得應(yīng)該只做和需要get對象相關(guān)的事情而昨,不應(yīng)該做其他的事情救氯,不如,在get函數(shù)里歌憨,把view添加到superView上着憨。
原因有很多,不羅列了务嫡,
GCD使用規(guī)范
類似這種
- (void)updateEnterForeground {
dispatch_async(dispatch_get_main_queue(), ^{
self.foreground = YES;
});
}
updateEnterForeground
這個(gè)函數(shù)大部分情況都是在主線程的甲抖,為什么內(nèi)部直接使用這個(gè)。心铃。
有時(shí)候這么做會(huì)延長對象生命周期准谚!,建議性做法類似其他第三方庫的:
#ifndef dispatch_main_async_safe
#define dispatch_main_async_safe(block)\
if (strcmp(dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL), dispatch_queue_get_label(dispatch_get_main_queue())) == 0) {\
block();\
} else {\
dispatch_async(dispatch_get_main_queue(), block);\
}
#endif
what ever ,this is safe!!
未完去扣,待續(xù)柱衔,巴拉巴拉
一個(gè)架構(gòu)師的成長哈哈哈哈