今天来给刚入行的学弟学妹来一点干货。
知其然不知其所以然,encode 大家并不陌生,开发中都会用到的东西。
废话不多说,直接上:
有时我们会遇到这样的需求,就是URL传参
https://host+path?key1=aa&key2=图片url地址(https://....)
or
https://host+path?key1=aa&key2=json串({key1=aa,key2=bb...})
这样的场景下,如果你把图片地址真的拼接到了整个URL中,那么恭喜,你会遇到一个问题,那就是怎么就加载不出来呢? 接着你就会去百度,然后呢,可能就看到我这篇文章了。
上面的URL之所以不能正常加载,就是它不符合一个http协议的编码规范,浏览器无法正常解析。正确的做法就是我们吧key2对应的传参进行encode编码,把它变成%E2%B3%
这种样式的。然后呢,不管是我们去跳转到原生页还是h5页面,由对应的页面取参数的时候再进行decode。
这里是URL的定义与对应的端(原生,h5)去协商好的。
NSString *encodeStr = [ string stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSString *decodeStr = [urlStr stringByRemovingPercentEncoding]
***************************** 知识点分割线 ******************************
接着说说 reloadItemsAtIndexPaths、reloadRowsAtIndexPaths
这两个方法分别的UICollectionView、UITableView刷新局部cell的方法,在平时的普通的列表中刷新某个cell时调用不会发现有什么不对。
最近我在项目中就遇到了一个复用性问题,当只有一个cell的时候,你去调用上面的方法去刷新当前cell,通过打印就会发现又创建了一个新的cell,如果你用reload方法,就不会有这样的情况。提醒一下大家注意喽。
去掉动画
[UIView performWithoutAnimation:^{
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}];
***************************** 知识点分割线 ******************************
enumerateObjectsUsingBlock
- (void) function {
[array enumerateObjectsUsingBlock:^(int _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (obj == 1) {
return;
// *stop = YES;
}
}];
NSLog(@"继续代码");
}
这是个遍历的方法,如果你选择这个方法去遍历,然后在一个函数中去做判断,return操作,那么你的注意一个事情,直接在block中 return;是不能让函数返回的,enumerateObjectsUsingBlock 中的return, 就相当于我们for循环中的continue; 让遍历进入到下一次循环。而后面的代码还会继续执行。
*stop = YES,就相当于for 循环中的break,让遍历停止了,但是函数中enumerateObjectsUsingBlock后面的代码还会继续执行。
enumerateObjectsUsingBlock 中的*stop = YES和 for 循环中的的break 有一点不一样,就是
break,既会打断本次循环,又会终止后面的的循环,
而 *stop = YES,只会中断后面的循环,而不会中断本次循环
如果我们想要中断本次循环,又要中断后面的循环,就要*stop = YES; return;共同使用,就达到了for循环中的break 的效果。
如果你想要让函数return,可以使用for循环,或者在enumerateObjectsUsingBlock外面定义一个变量isNeedReturn = NO; 在block里面设置isNeedReturn = Yes;
在后面的代码中进行判断,然后return;
网友评论