Block

作者: iOS_Alex | 来源:发表于2016-08-18 13:20 被阅读35次

    关于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

    相关文章

      网友评论

        本文标题:Block

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