杂记

2016-11-13  本文已影响17人  ProgressChen

基础

?:

NSString *test = @"test";
NSString *result = test?:@"fail";//result = @"test",当test为真时使用test值。

网络相关

User Agent

User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

acceptableContentTypes

在网络response中会有“content type”在响应头中,如图:


responseHeader.png

content types用来标记网络响应的包的格式,此图中数据为JSON格式,可以按照这种格式进行数据解析。
在AFNetworking中默认的使用”AFJSONResponseSerializer“对responseSerializer进行初始化。

self.responseSerializer = [AFJSONResponseSerializer serializer];

所以,默认可响应的数据格式有3种“application/json", "text/json","text/javascript",如果想增加其他格式需要向acceptableContentTypes中添加即可。

+ (instancetype)OSCJsonManager
{

//AFN中所有的网络请求都是由manager进行管理操作的。
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
 
//向acceptableContentTypes中增加"text/html"格式的响应。
    manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];

//设置UA
    [manager.requestSerializer setValue:[self generateUserAgent] forHTTPHeaderField:@"User-Agent"];

    return manager;
}

用户基本信息的存储使用的NSUserDefaults

NSUserDefaults 使用键值对将数据进行存储。

NSUserDefualts *userDefaults = [NSUserDefaults standardUserDefaults];

[userDefaults setInteger:user.ID forKey:@"ID"];  //存储ID
[userDefaults setObject:user.name forKey:@"name"];  //存储name ,类型为NSString

user.ID = [userDefaults integerForKey:@"ID"];  //获取int型
user.name = [userDefaults objectForKey:@"name"];  //获取name ,类型为NSString

2016-11-17

坑1.网络数据刷新如何处理如上下拉刷新数据

填坑:上下拉请求更新数据
使用第三方的<MJExtension.h>和<MJRefresh.h>进行数据请求处理代码如下:

self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
        //上拉数据请求
    }];
    self.tableView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingBlock:^{
        //下拉数据请求
    }];

当页面第一次显示时在viewDidLoadviewWillAppear中进行网络数据请求。

坑2.OSCObjsViewController中 refresh方法的调用
在此类的viewWillAppear中加入:NSLog(@"%@", [NSString stringWithUTF8String:object_getClassName(self)]); 查看一下继承此类时会不会自动调用此方法。

在tableViewController中,拖动cell滚动时会不是调用scrollViewDidScroll方法?
会自动调用,无论是上拉还是下拉

通知

在视图viewWillAppear:中添加一个Observer,在视图退出时viewWillDisappear:移除观察者。


- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];   
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dawnAndNightMode:) name:@"dawnAndNight" object:nil];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"dawnAndNight" object:nil];
}

泛型约束

__kindof

只允许本类或子类,相当于参数约束,如:
如说一个NSArray<UIView >,如果不加__kindof
,这个数组只能有UIView,即便是其子类也不行。而加了的话NSArray<__kindof UIView >,传入UIView的子类也是可以的,如UIImageView,UIButton等UIIView的子类都适用。

__typeof

在新的写法中已经将__typeof替换成了typeof()

typeof的使用

在iOS中的使用,常见运用于Block 。
下面看一个典型的用法:
__block typeof(self) bself = self;
[self methodBlock:^ {
[bself doSomething];
}
代码解释:定义一个和self相同数据类型的bself ,并赋值为self,在block中使用

神奇的宏

YYKit定义了以下2个宏

@weakify(self) & @strongify

// @weakify(self)
#define weakify(object) autoreleasepool{} __weak __typeof__(object) weak##_##object = object;

//@strongify
#define strongify(object) autoreleasepool{} __typeof__(object) object = weak##_##object;

@weakify(self)展开后:__weak __typeof__(self) weak_self = self;进一步的剖析__typeof__(self)根据self的类型返所属类,进一步简化__weak CLASS weak_self = self;这就容易理解多了,相当于定义了一个弱引用类型的self。

@strongify(self)最中展开后CLASS self = weak_self; 将self变成了弱引用类型了。

@strongify一定于@weakify成对儿使用,一般多用于block中如下代码:

 @weakify(self)
    [self doSomething^{
        @strongify(self)
        if (!self) return;
        ...
    }];

方法

respondsToSelector

判断是否实现了某方法。

init

2016-12-20

tableView cell高度

默认cell高度是44, 定高cell建议使用self.tableView.rowHeight = 88;,针对可变的cell高度可以在UITableViewDelegate中实现:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // return xxx}
需要注意的是,实现了这个方法后,rowHeight
的设置将无效。所以,这个方法适用于具有多种 cell 高度的 UITableView。

参考链接

上一篇下一篇

猜你喜欢

热点阅读