美文网首页
URL encode 、reloadItemsAtIndexPa

URL encode 、reloadItemsAtIndexPa

作者: th先生 | 来源:发表于2020-12-31 14:35 被阅读0次

    今天来给刚入行的学弟学妹来一点干货。

    知其然不知其所以然,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;

    相关文章

      网友评论

          本文标题:URL encode 、reloadItemsAtIndexPa

          本文链接:https://www.haomeiwen.com/subject/apoznktx.html