201807工作笔记

0702
1.利用strong和copy的属性特性来做缓存(memery save), 才理解了strong和copy真正的用途.

A页面push到B页面,返回A,再次进入B时,B会因为alloc而init了所有数据,
那有什么办法缓存B的数据呢? 
--只要在B控制器的.h中,设立一个strong特质的属性,来作为A与B的桥梁.
如此一来,B页面的model值发生任何改变,A页面的model会因strong特性而做相同改变.

但是,这样还不够!比如B页面pop到A页面后销毁以后, 
B的model数据可能会丢失而连带A的model数据丢失.
所以,这时copy就派上用场了.
只需把model的对象类型属性特质为copy, 基本数据类型为assign即可.
当再次进入B时,页面可根据model一一手动设置旧数据,此时model数据是完好的.

0703
使用single单例做全局保存, 对于一些get的接口,每次运行app只需load一次,可以缓存到单例的数组里,便于项目获取直接使用,连sqlite保存都省了.

0704
尝试了”方法block”, 十分好用神奇(之前一直使用属性block,两者还是有区别的)

//需求:
//A需要调用B的方法, 当B处理完事务后, 把结果返回给A.
//A代码
[self sgsLivenessTest:^(id data) {
        //获得结果data
}];
//B的方法(block类型在B的h文件声明即可)
-(void)sgsLivenessTest:(SGSIDLFaceToolBlock)sgsBlock{   
     //do something...{

          //回调
          sgsBlock(imaStr64);
     }
     //other code...      
}

0705
从后台获得model后,有时需要对数据进行转化,比如
字段PAYWAY( 1:一次性付款;2:商业贷款;3:公积金贷款)

//思路:后台返回的是数字,自己新定义一个字段PAYWAY_TEXT,作为对应的中文
//数据处理放在model层
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic{
    //付款方式文字
    NSString *payway = dic[@"PAYWAY"];
    if (!kStringIsEmpty(payway)) {
        if ([payway isEqualToString:@"1"]) {
            self.PAYWAY_TEXT = @"一次性付款";
        } else if ([payway isEqualToString:@"2"]) {
            self.PAYWAY_TEXT = @"商业贷款";
        } else if ([payway isEqualToString:@"3"]) {
            self.PAYWAY_TEXT = @"公积金贷款";
        } else{
            self.PAYWAY_TEXT = @"";
        }
    }
    return YES;
}

0706
处理了tableview”上拉加载”时, 重复请求同一个page的问题, 也搞定了”上拉加载”时,底部该显示”无更多数据”还是”加载更多”的问题

//说说我的核心思路:
//1.1第一次请求,tableIndex=1去request,tableview底部是个loading标志.
//1.2响应后,需要后台返回当前data的pageIndex和总页数pageSum,这两个数据后台是可以拿到的.

//2.1判断请求的tableIndex和后台给你的pageIndex是否一致
    if (self.currentPageIndex != index) {
        //如果我请求的cx不等于后台返回的index,说明重复请求了.
        return;
    }
//2.2到这里,说明不存在重复请求,把后台的data放入self.tableDatas后,
    self.currentPageIndex = index+1;//这是唯一使tableIndex+1的地方

//3.自己判断,if(后台的pageIndex<pageSum),则用户再次下拉时显示"加载更多"的标志,继续请求...
//反之,如果pageIndex==pageSum,则"无更多数据",不用再请求.

//部分源码:
#pragma mark - request的回调
-(void)sgsOldHouseHandleResult:(BOOL)isSuccess isMore:(BOOL)isMorePage list:(NSArray<SGSHouseListModel *> *)listData serverPage:(NSInteger)index{

    [self endAllRefresh:self.sgsIGCollectView];
    if (isSuccess==NO) {
        return;
    }
    if (self.currentPageIndex != index) {
        //如果我请求的cx不等于后台返回的index,说明重复请求了.
        return;
    }
    if (self.currentPageIndex == 1) {
        self.listDatas = [NSMutableArray array];
    }
    self.currentPageIndex = index+1;//以后台返回当前index为准
    [self.listDatas addObjectsFromArray:listData];
    self.isHaveMorePage = isMorePage;
    [self.sgsIGAdapter reloadDataWithCompletion:nil];//刷新
}

再说说tableview”下拉加载”的category, 解耦合:

#import <UIKit/UIKit.h>
@interface UIViewController (SGSUIRefresh)

#pragma mark - MJRefresh
- (void)setFooterRefresh:(UIScrollView *)scrollView;
- (void)endFooterRefresh:(UIScrollView *)scrollView;

#pragma mark - MJ伪回调,实现类自己添加"request"即可.
- (void)footerRefreshing;
@end


#import "UIViewController+SGSUIRefresh.h"
#import <MJRefresh.h>
@implementation UIViewController (SGSUIRefresh)
- (void)setFooterRefresh:(UIScrollView *)scrollView {
    if (scrollView.mj_footer == nil) {
        scrollView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(footerRefreshing)];
    }
}

- (void)endFooterRefresh:(UIScrollView *)scrollView
{
    [scrollView.mj_footer endRefreshing];
}

- (void)footerRefreshing {
    //实现类在这里request...
}

category写好了, 该如何使用?

//viewDidLoad里面添加footer
[self setFooterRefresh:self.tableView];

//实现自己的request
-(void)footerRefreshing{
    [self loadRemoteData];
}

0707
记ios的present Controller的一个小问题, 比如A–>B(present):

//在B的.h里面,设置一个属性testName
//当在A里面写:
     B *b = [[B alloc]init];
     b.testName = @"hhh";
     [self presentViewController:b animated:NO completion:nil];
//你会发现在b的viewDidLoad里面,testName是nil.
//解决方法:在viewWillAppear里面,才可以获取到testName.
//打断点发现代码顺序:
①b的init
②b的viewDidLoad     
③b.testName = @"hhh";//才赋值
④b的viewWillAppear
简直就呵呵了.

0708
关于textField如何准确及时获取text ?
先说需求, 就是普通的登录页面.
正确结论:点击

//1.此代理方法,是在'把新字符赋予textField'之前就执行的,
//所以,此方法的textField.text是旧值,text是不准确的!!
-(BOOL)textField:(UITextField *)textField 
shouldChangeCharactersInRange:(NSRange)range 
replacementString:(NSString *)string;

//2.此代理方法,是在光标消失后(退出编辑后),才执行
//如果用户没把键盘收回去,就点击登录按钮.
//此代理的textField.text也是不准确
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField;
//所以,我觉得ios的UITextFieldDelegate非常没用!!

我的方法,
使用UITextFieldTextDidChangeNotification+全局变量textField.text
这样,无论什么变化,都可以及时获得正确的text

//初始化时
[[NSNotificationCenter defaultCenter] addObserver:self
 selector:@selector(setMyValueForTextField) 
 name:UITextFieldTextDidChangeNotification object:nil];
//销毁时
[[NSNotificationCenter defaultCenter] removeObserver:self 
name:UITextFieldTextDidChangeNotification object:nil];

//获取text
-(void)setMyValueForTextField{
    model.commonBuyer.QLRMC = [self.nameField.text 
    stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];  
}

猜你喜欢

转载自blog.csdn.net/james15902085063/article/details/80905531