iOS 跟进项目发现的小问题

跟进项目发现的小问题

这两天再跟进小需求,正好赶上项目要重构,记录一下小细节……

应用前后台标记

typedef NS_ENUM(NSInteger, UIApplicationState) {
    UIApplicationStateActive,
    UIApplicationStateInactive,
    UIApplicationStateBackground
} NS_ENUM_AVAILABLE_IOS(4_0);

就可以记录App的状态,不用在Appdelegate里面做各种标记,比如:

@interface AppDelegate ()

@property (nonatomic, getter=isForeground) BOOL foreground;

此处使用foreground来标记应用是否在前后台,然后当应用前后台切换的时候设施这个bool

***本地化存储****

使用 NSUserDefaults 应该单独写一个类,全局都从这个类去存储。
现在随便写随便调用,命名也不规范,有使用宏来定义key,有使用static来定义key. NSUserDefaults 本质是一个plist,所以不应该存储image这样子的大数据。

内存存储,也应该全局统一提供接口,比如使用NSCache或者NSDictionery

UIAlertView

因为产品近期提出了很多类似于 UIAlertView 弹出顺序的问题,比如:要连着弹出很多个UIAlertView,但是他们都在不同的模块,但是有优先级,触发的时机有可能是通知有可能是用户操作等等。

类似前面的东东,UIAlertView 的弹出也应该全局统一处理,做一个队列,提供先进先出,和优先级的弹出策略。

触摸状态栏,UIScrollView滚动到顶部的策略
不应该在 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子类的页面中监听通知去实现,如果一个页面的 UIScrollView 太多,导致点击状态栏没有办法滚动到顶部,应该去实现 UIScrollView的代理方法。

比如:

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView {
    if ([_outerDelegate respondsToSelector:_cmd]) {
        return [_outerDelegate scrollViewShouldScrollToTop:scrollView];
    }
    return YES;
}

不需要滚动的view返回NO,一个页面保证一个 UIScrollView 足矣!!

SDWebImage使用问题

- (void)configSDWebimage {
    /**
     *  由于远程图片为高分辨率,为了减少内存大量飙升,加入非解压的方法来控制,限制缓存
     */
    [[SDWebImageDownloader sharedDownloader] setShouldDecompressImages:NO];

图片下载后在非主线程解压然后展示在主线程是优化流畅度的一个重要手法,这也是sd设置这个默认为YES的重要原因。

吧啦吧啦,图片高分辨率,远程……应该能知道哪些页面是所谓高分辨率,然后单独做设置。。

比如:

1、首先在封装的控制器中定义变量用于存储原设置:

static BOOL SDImageCacheOldShouldDecompressImages = YES;
static BOOL SDImagedownloderOldShouldDecompressImages = YES;

2、loadView中保存原设置并且禁用解压缩:

SDImageCache *canche = [SDImageCache sharedImageCache];
SDImageCacheOldShouldDecompressImages = canche.shouldDecompressImages;
canche.shouldDecompressImages = NO;

SDWebImageDownloader *downloder = [SDWebImageDownloader sharedDownloader];
SDImagedownloderOldShouldDecompressImages = downloder.shouldDecompressImages;
downloder.shouldDecompressImages = NO;

3、dealloc中恢复原设置:

-(void)dealloc {
    SDImageCache *canche = [SDImageCache sharedImageCache];
    canche.shouldDecompressImages = SDImageCacheOldShouldDecompressImages;
    
    SDWebImageDownloader *downloder = [SDWebImageDownloader sharedDownloader];
    downloder.shouldDecompressImages = SDImagedownloderOldShouldDecompressImages;
}

苹果也有给出高清大图的Demo. Large Image Downsizing

总之,不应该为了预防性节省内存,牺牲流畅度等用户体验。

集中打点的问题
现在项目中的打点如下方式

[[DDStatistics sharedInstance] remindDDMessageID:dictionary[@"push_id"]
                                                      roomID:roomId
                                                      Status:@"3"];

DDStatistics这个模块在整个项目中有飘来飘去,建议引入切面编程的方式使用配置文件打点,比如引入 aspect.

某日,产品经理让我找找某个点在哪里打的,比如,10086这个点是哪里的,我就这样子,全局搜索10086,我擦,木有,算了全局搜索 DDStatistics 我擦,还是木有,最后各种排查,发现是传入的某个函数的参数。巴拉巴拉。。。

关于get函数的职责

get函数,我觉得应该只做和需要get对象相关的事情,不应该做其他的事情,不如,在get函数里,把view添加到superView上。

原因有很多,不罗列了,

GCD使用规范
类似这种

- (void)updateEnterForeground {
    dispatch_async(dispatch_get_main_queue(), ^{
        self.foreground = YES;
    });
}

updateEnterForeground这个函数大部分情况都是在主线程的,为什么内部直接使用这个。。
有时候这么做会延长对象生命周期!,建议性做法类似其他第三方库的:

#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!!

未完,待续,巴拉巴拉

一个架构师的成长哈哈哈哈

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容

  • 非原创,收集,整理,觉得有用就罗列下为避免下次犯迷糊。 IOS 中的 AppDelegate.m/h 文件是很重要...
    西蜀阅读 525评论 0 0
  • 花开香雪好运来,山丹丹流彩。夕阳悦悦红顶戴,晚霞茵茵诉情怀,自豪迈! 欢歌笑语心境开,风悄悄采摘,香花肆意心不改,...
    曦微w行走在路上阅读 643评论 0 6
  • 1今天练习了手法,明白所有付出都会有回报。 2自己要多做顾客,多告诉顾客身体的问题才能让顾客更加清楚自身的问题。 ...
    青心争己阅读 703评论 0 0
  • 最近在研究jenkins,因在研究阶段,所有不敢用公司的svn,所以只好自己动手操作了,对于打包工具来说,我是小白...
    草中人阅读 626评论 0 0
  • 今天再次踏上1485次列车,心情无比复杂。上次有爸妈的陪伴,这次只有熟识的同龄人与我同行。没有别人的帮助,一...
    G_Jane阅读 372评论 0 0