1.指定数组存放的类型:
2.三目运算符:这是UITableView在iOS 8 新增的代理方法,它反馈的数组必须是UITableViewRowAction对象
- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
我们可以仿照这种写法,NSArray<Model *> *modelArray = .....;这种写法更严谨
3.仿系统UIAlertView初始化方法,带不定数量的字符串基本格式 : (关系表达式) ? 表达式1 : 表达式2;
执行流程 : 关系表达式为 真 返回表达式1 关系表达式为假 返回表达式2
NSInteger index = 0; NSString *string = index == 0 ? @"是0" : @"不是0";
代码如下:
调用时:+(void)addAlertViewWithTitle:(nullable NSString *)title message:(nullable NSString *)message cancelButton:(nullable NSString *)cancel otherButtonTitles:(nullable NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION;
+(void)addAlertViewWithTitle:(NSString *)title message:(NSString *)message cancelButton:(NSString *)cancel otherButtonTitles:(NSString *)otherButtonTitles, ... { if (otherButtonTitles == nil) { return; } va_list arguments; id eachTitle; NSLog(@"otherButtonTitles:%@", otherButtonTitles); va_start(arguments, otherButtonTitles); while ((eachTitle = va_arg(arguments, id))) { NSLog(@"otherButtonTitles:%@", eachTitle); <span style="white-space:pre"> </span>} va_end(arguments); }
4.过滤服务器返回的带转义字符的JSON数据(去除中间的反斜杠)
数据格式如下:代码如下:data = "{\"updateDt\":null,\"updateBy\":null,\"authCode\":null,\"mobile\":\"181*******9\",\"passWord\":null,\"deviceType\":null,\"pushId\":\"622E2ECA2EF3\",\"createDt\":null,\"isPush\":\"1\",\"createBy\":null,\"exist\":null,\"verifyCode\":null,\"nickName\":\"\U9b3c\",\"qq\":null,\"avatarUrl\":\"http://0a6baab8274696be069b77e2e9b7d9.jpg\",\"registerDt\":null,\"userName\":null,\"token\":\"sdsdsdas6ab\",\"status\":null,\"type\":null}"; }
/** 解析带转义字符的JSON数据,返回解析后的数据(字典形式) @param jsonString 待解析的数据 @return 字典类型 */ + (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString { NSMutableString *responseString = [NSMutableString stringWithString:jsonString]; NSString *character = nil; for (int i = 0; i < responseString.length; i ++) { character = [responseString substringWithRange:NSMakeRange(i, 1)]; if ([character isEqualToString:@"\\"]) [responseString deleteCharactersInRange:NSMakeRange(i, 1)]; } if (jsonString == nil) { return nil; } NSData *jsonData = [responseString dataUsingEncoding:NSUTF8StringEncoding]; NSError *err; NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err]; if(err) { NSLog(@"json解析失败:%@",err); return nil; } return dic; }
解析后的格式:{ authCode = "<null>"; avatarUrl = "http://*********/330a6baab8274696be069b77e2e9b7d9.jpg"; createBy = "<null>"; createDt = "<null>"; deviceType = "<null>"; exist = "<null>"; isPush = 1; mobile = 181*******9; nickName = "\U9b3c"; passWord = "<null>"; pushId = "B-487D-8493-622E2ECA2EF3"; qq = "<null>"; registerDt = "<null>"; status = "<null>"; token = 414dec248c945a06ab; type = "<null>"; updateBy = "<null>"; updateDt = "<null>"; userName = "<null>"; verifyCode = "<null>"; }
5.解析服务器返回的错误信息和网络错误信息
问题描述:
一些稍大型的互联网公司对网络交互这一块要求是非常严格的,举个例子,假设我们进行一个账号登录的数据请求,一般小型的公司大多都是在请求成功的方法里面添加一些字段,比如说100或者200等状态码,其他的状态码则表示不同类型(密码错误、账号未注册等)的错误,而这些在大型公司里边要求就是只有在登录成功时候才能进请求成功的方法,其他所有的错误信息都要走请求失败的方法,然而这也造成了一些问题,这些返回的错误就会和一些属于网络的异常混淆在一起,在AFNetworking中封装的有这类错误的解析方法,NSError接收返回的错误,在NSError中有这样一个属性localizedDescription来描述错误信息(比如说请求超时等)。而服务器返回的错误用这个属性是获取不到的,就需要对它的另一个属性userInfo解析,
系统是这样描述的:
/* Additional info which may be used to describe the error further. Examples of keys that might be included in here are "Line Number", "Failed URL", etc. Embedding other errors in here can also be used as a way to communicate underlying reasons for failures; for instance "File System Error" embedded in the userInfo of an NSError returned from a higher level document object. If the embedded error information is itself NSError, the standard key NSUnderlyingErrorKey can be used. */ @property (readonly, copy) NSDictionary *userInfo;
中文意思是:
可用于进一步描述错误的附加信息。 此处可能包括的键的示例是“行号”,“失败的URL”等。 在此嵌入其他错误也可以用作传达失败的潜在原因的方式; 例如嵌入在从较高级别文档对象 返回的NSError的userInfo中的“文件系统错误”。 如果嵌入的错误信息本身是NSError, 则可以使用标准键NSUnderlyingErrorKey。
因此就需要我们在userInfo这一属性中获取错误信息,可以这样来写:
调用时候:
/** * 解析错误信息,以服务端返回的错误信息为主,接受不到服务端的错误信息时候返回系统错误信息描述error.localizedDescription * * @param error 服务器返回的错误信息 * * @return 解析后的错误信息 */ + (NSString*)resolveWithError:(NSError*)error { NSDictionary* dic = error.userInfo; //这是我通过验证得到的键值对,每个公司返回的错误信息可能不一样,因此用这个com.alamofire.serialization.response.error.data可能解析不到你的错误信息,这就需要各位的自己尝试了 NSData* data = [dic objectForKey:@"com.alamofire.serialization.response.error.data"]; NSString* string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; if (string.length == 0) {//先检测是否是系统的异常,如果是系统的错误直接返回错误信息 return error.localizedDescription; } //如果不是系统的错误就返回服务器返回的错误信息,错误信息一般是要通过提示框展示给用户看的,因此不宜过长 else if (string.length > 50) {//如果服务器返回的信息过长,则可能是返回的html错误,此时也可以解析,但我公司要求的是如果错误信息多的话直接显示网络异常即可 return @"网络错误"; } else { return string; } }
[manager POST:RESETTING_PSW_API parameters:parameterDic progress:^(NSProgress* _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask* _Nonnull task, id _Nullable responseObject) { } failure:^(NSURLSessionDataTask* _Nullable task, NSError* _Nonnull error) { errorBlock(<span style="color:#ff0000;background-color: rgb(255, 255, 102);">[self resolveWithError:error]</span>); }];