关于Block语法
通过target+selector模式进行方法的传递
通过Block模式进行方法的传递
Category
网络请求操作的封装
解析类的封装(非完善版)
关于Block语法
本质上就是把方法体当做指针进行了传递, 对比target+selector方式, 不用再传递方法所在对象了
通过target+selector模式进行方法的传递
[CakeShop makeCakeForSomeOne:selfcontact:@selector(cakeComplete:)];
- (void)cakeComplete:(NSString*)money{
NSLog(@"蛋糕已做完, 速取!, 价格%@", money);
}
@implementationCakeShop
+ (void)makeCakeForSomeOne:(id)target contact:(SEL)selector{
//做蛋糕耗费5秒钟
[[NSOperationQueuenew] addOperationWithBlock:^{
sleep(5);//做蛋糕
//做好蛋糕以后, 使用 某人 给的 联系方式 来通知他
[target performSelector:selector withObject:@"50"];
}];
}
@end
通过Block模式进行方法的传递
[CakeShop makeCakeCompletionHandle:^(NSString*money) {
NSLog(@"蛋糕已做完, 速取!, 价格%@", money);
}];
+ (void)makeCakeCompletionHandle:(void(^)(NSString*))selector{
dispatch_async(dispatch_get_global_queue(0,0), ^{
sleep(5);
selector(@"50");//这是C语法, 函数调用
});
}
Category
OC特有的Category语法,作用于继承类似。 官方说法是比继承少了增加属性的功能。
不过在实际工作中, 我们会利用runtime机制, 让Category也可以增加属性。
Category的好处是对程序的侵染性更低, 不像继承,必须每个类都继承于父类才会拥有父类的方法和属性。
Category只需要引入头文件即可。
网络请求操作的封装
因为网络请求操作十分常用,所以通常我们会把网络操作封装起来
#import"NSObject+URLSession.h"
@implementationNSObject(URLSession)
+ (id)GET:(NSString*)path completeHandle:(void(^)(id,NSError*))completionHandle{
NSURL*url = [NSURLURLWithString:path];
//设置缓存策略 + 请求超时时间
NSURLRequest*request = [NSURLRequestrequestWithURL:url cachePolicy:0timeoutInterval:30];
NSURLSessionDataTask*task = [[NSURLSessionsharedSession] dataTaskWithRequest:request completionHandler:^(NSData* _Nullable data,NSURLResponse* _Nullable response,NSError* _Nullable error) {
if(error) {
completionHandle(nil, error);
return;
}
idobj = [NSJSONSerializationJSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves|NSJSONReadingAllowFragmentserror:&error];
if(error) {
completionHandle(nil, error);
return;
}
completionHandle(obj,nil);
}];
[task resume];
returntask;
}
@end
解析类的封装(非完善版)
在工作中,解析操作是非常常用的, 因为解析操作具有一定的规律性,我们可以通过抽象,
把这些规律总结起来,制作一个通用的解析基类。
#import"NSObject+Parse.h"
@implementationNSObject(Parse)
//解析字典
+ (id)parseDic:(NSDictionary*)responseObj{
idmodel = [selfnew];
[responseObj enumerateKeysAndObjectsUsingBlock:^(id_Nonnull key,id_Nonnull obj,BOOL* _Nonnull stop) {
//如果值是数组
if([obj isKindOfClass:[NSArrayclass]]) {
//查看是否有针对的内容解析类
NSDictionary*dic = [selfobjectClassInArray];
if([dic objectForKey:key]) {
Class class = dic[key];
//使用特殊的类来解析数组的内容
obj = [class parse:obj];
}
}
//把键过滤
key = [selfpropertyNameForKey:key];
[model setValue:obj forKey:key];
}];
returnmodel;
}
//解析数组
+ (NSArray*)parseArr:(NSArray*)responseObj{
NSMutableArray*arr = [NSMutableArraynew];
for(idobjinresponseObj) {
[arr addObject:[selfparse:obj]];
}
return[arrcopy];
}
+ (id)parse:(id)responseObj{
if([responseObj isKindOfClass:[NSDictionaryclass]]) {
return[selfparseDic:responseObj];
}
if([responseObj isKindOfClass:[NSArrayclass]]) {
return[selfparseArr:responseObj];
}
returnresponseObj;
}
+ (NSDictionary*)objectClassInArray{
returnnil;
}
+ (NSString*)propertyNameForKey:(NSString*)key{
returnkey;
}
- (void)setValue:(id)value forUndefinedKey:(NSString*)key{}
- (void)setNilValueForKey:(NSString*)key{}
@end