一,一个界面等需要请求多个接口时候,用上多线程,之后再刷新UI,而不是在AF的回调里 再次请求下一个接口,上代码。
-(void)loadRequest
{
NSLog(@"STAR");
//线程
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//创建分组
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
NSLog(@"数据请求1");
});
dispatch_group_async(group, queue, ^{
NSLog(@"数据请求2");
});
/**
* 回到主线程刷新UI
*/
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"刷新UI");
});
NSLog(@"END");
}
打印结果为
STAR END 数据请求1 数据请求2 刷新UI
二,block 其实就是一个对象,用copy修饰只是MRC的产物,把block从栈拷贝到堆,可以在作用域之外使用(防止崩溃),现在实际上用strong 也是没问题的。
三,性能优化方面
1,使用轻量级的对象可以考虑使用CALayer取代UIView,不要频繁地调用UIView的相关属性,比如frame、bounds、transform等属性,尽量减少不必要的修改。
2,如果有卡顿,一般来说是在主线程中写有一些耗时的操作,可以添加观察者(Observer)到主线程RunLoop中,通过监听RunLoop状态切换的耗时,以达到监控卡顿的目的。
三,KVC ,KVO
KVC:键值编码,使用字符串访问对象的属性。
工作原理:检查key相对应的set方法是否存在,如果存在就直接调用set方法,如果不存在,就会查找和key相同名字并且带_的成员属性(_key),如果存在就把_key赋值给属性,如果不存在,就会查找相同名称的属性key,如果有就直接赋值,如果没有就会调用valueForUndefinedKey:和setValue:forUndefinedKey:方法。
KVO:键值对观察机制
工作原理:当给A类添加观察值时,runtime 动态生成一个衍生类(子类)NSKVONotifying_A,并把A类的isa指针 指向NSKVONotifying_A,重写class,隐藏对象真实类信息。重写setter方法,当监听对象的值发生改变的时候会调用willChangeValueForKey/didChangeValueForKey,,向系统发出NSKeyValueChangeSetting的通知,然后系统的通知中心,就会通知监听者,调用-observeValueForKeyPath:ofObject:change:context:方法来实现监听被监听者的值改变。
三,Masonry链式语法怎么实现的
如make.top.left 其实我们只需要把make.top的返回值变成self就可以继续调用了
如make.top.equalTo(@"20"); 我们只需要加一个block作为返回的值,就可以了。上代码
Person类.h:
-(Person *)getFirstName;
-(Person *)getLastName;
-(void(^)(int))getAge;
-(Person*(^)(NSString*))getSex;
-(void)createPerson:(void(^)(Person*person))Block;
.m:
-(Person *)getFirstName{
self.firstName =@"李";
return self;
}
-(Person *)getLastName{
self.lastName=@"kf";
return self;
}
-(void(^)(int))getAge{
return^(intage){
self.age=age;
};
}
-(Person*(^)(NSString*))getSex{
return^(NSString* sex){
self.sex= sex;
returnself;
};
}
-(void)createPerson:(void(^)(Person*))Block{
Block(self);
}
调用他
Person*per = [[Personalloc]init];
[percreatePerson:^(Person*_Nonnullperson) {
person.getFirstName.getLastName.getSex(@"男").getAge(100);
}];
NSLog(@"%@",per.sex);
NSLog(@"%d",per.age);
NSLog(@"%@",per.firstName);
NSLog(@"%@",per.lastName);
2021-01-13 15:33:45.995444+0800 single[3860:80865] 男
2021-01-13 15:33:45.995564+0800 single[3860:80865] 100
2021-01-13 15:33:45.995678+0800 single[3860:80865] 李
2021-01-13 15:33:45.995787+0800 single[3860:80865] KF
就完成了 比较简洁
四,Nsstring 作为属性到底用什么修饰?
在不可变的nsstring情况下其实都一样,copy,strong 都一样 因为他们指向同一个地址。
但是mutbleString的时候并且修改他的值,copy不再指向string的地址,进行了深拷贝,所以是无法修改的
strong是可以修改的。上代码
-(void)testMutbleString{NSMutableString*mutbleString=[NSMutableString stringWithFormat:@"lkf"];
self.strongStr=mutbleString;
self.copyedStr=mutbleString;
// [mutbleString appendString:@" 123"];
NSLog(@"mut origin string: %p, %p",mutbleString,&mutbleString);
NSLog(@"mut strong string: %p, %p",_strongStr,&_strongStr);
NSLog(@"mut copyed string: %p, %p",_copyedStr,&_copyedStr);
}
这时候strong 和 原有的 地址是会变的 输出也是 @“lkf123”
但是copy输出则是@"lkf"
四,MJExtension是怎么实现的,原理?
如有不足,或者错误,请您马上翻脸指出,持续更新,谢谢!