NSObject比较实用的Category

来源:互联网 发布:isis软件中电源 编辑:程序博客网 时间:2024/06/05 16:24

头文件

////  NSObject+Utils.h//  UIView+CategoriesDemo////  Created by su xinde on 13-4-12.//  Copyright (c) 2013年 su xinde. All rights reserved.//#import <Foundation/Foundation.h>@interface NSObject (Utils)//perform block1 in main thread,when finished perform block2 in background+ (void)perform:(void(^)())block1 withCompletionHandler:(void (^)())block2;- (void)perform:(void(^)())block1 withCompletionHandler:(void (^)())block2;//use Object to deliver param(retain)- (void)setObject:(id)obj;- (id)getObject;//默认block回调 key:DefaultEventHandler- (void)handlerDefaultEventWithBlock:(id)block;- (id)blockForDefaultEvent;//设置一个block作为回调- (void)handlerEventWithBlock:(id)block withIdentifier:(NSString *)identifier;- (id)blockForEventWithIdentifier:(NSString *)identifier;//send object//handle block with default identifier is @"ObjectSingleObjectDictionary".- (void)receiveObject:(void(^)(id object))sendObject;- (void)sendObject:(id)object;//tag can't be nil- (void)receiveObject:(void(^)(id object))sendObject withIdentifier:(NSString *)identifier;- (void)sendObject:(id)object withIdentifier:(NSString *)identifier;//给UITableViewCell的数据存储计算过的行高的,防止重复计算//用法: 在ViewController的heightForRowAtIndexPath:方法里返回cell高度height之前//      先调用一次[self setCellRowHeight:height]; 然后在cellForRowAtIndexPath://      方法里调用[self cellRowHeight];即可获取行高,免去直接调用heightForRowAtIndexPath:造成的重复计算。- (float)cellRowHeight;- (void)setCellRowHeight:(float)height;@end

实现文件

#import "NSObject+Utils.h"#import <objc/runtime.h>@implementation NSObject (Utils)+ (void)perform:(void(^)())block1 withCompletionHandler:(void (^)())block2{    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{        block1();        dispatch_async(dispatch_get_main_queue(),^{            block2();        });    });}- (void)perform:(void(^)())block1 withCompletionHandler:(void (^)())block2{    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{        block1();        dispatch_async(dispatch_get_main_queue(),^{            block2();        });    });}//======================const char ObjectStoreKey;- (void)setObject:(id)obj{    objc_setAssociatedObject(self, &ObjectStoreKey, obj, OBJC_ASSOCIATION_RETAIN);}- (id)getObject{    return objc_getAssociatedObject(self, &ObjectStoreKey);}//=======================const char ObjectEventHandlerDictionary;- (void)handlerDefaultEventWithBlock:(id)block{    [self handlerEventWithBlock:block withIdentifier:@"DefaultEventHandler"];}- (id)blockForDefaultEvent{    return [self blockForEventWithIdentifier:@"DefaultEventHandler"];}- (void)handlerEventWithBlock:(id)block withIdentifier:(NSString *)identifier{    NSAssert(identifier != nil, @"identifier can't be nil.");    NSMutableDictionary *eventHandlerDictionary = objc_getAssociatedObject(self,&ObjectEventHandlerDictionary);    if(eventHandlerDictionary == nil)    {        eventHandlerDictionary = [[NSMutableDictionary alloc] init];        objc_setAssociatedObject(self, &ObjectEventHandlerDictionary, eventHandlerDictionary, OBJC_ASSOCIATION_RETAIN);    }        [eventHandlerDictionary setObject:block forKey:identifier];}- (id)blockForEventWithIdentifier:(NSString *)identifier{    NSAssert(identifier != nil, @"identifier can't be nil.");    NSDictionary *eventHandlerDictionary = objc_getAssociatedObject(self,&ObjectEventHandlerDictionary);    if(eventHandlerDictionary == nil) return nil;    return [eventHandlerDictionary objectForKey:identifier];}//=======================const char ObjectSingleObjectDictionary;- (void)receiveObject:(void(^)(id object))sendObject{    [self receiveObject:sendObject withIdentifier:@"ObjectSingleObjectDictionary"];}- (void)sendObject:(id)object{    [self sendObject:object withIdentifier:@"ObjectSingleObjectDictionary"];}- (void)receiveObject:(void(^)(id object))sendObject withIdentifier:(NSString *)identifier{    NSAssert(identifier != nil, @"identifier can't be nil.");    NSMutableDictionary *eventHandlerDictionary = objc_getAssociatedObject(self,&ObjectSingleObjectDictionary);    if(eventHandlerDictionary == nil)    {        eventHandlerDictionary = [[NSMutableDictionary alloc] init];        objc_setAssociatedObject(self, &ObjectSingleObjectDictionary, eventHandlerDictionary, OBJC_ASSOCIATION_RETAIN);    }        [eventHandlerDictionary setObject:sendObject forKey:identifier];}- (void)sendObject:(id)object withIdentifier:(NSString *)identifier{    NSAssert(identifier != nil, @"identifier can't be nil.");        NSDictionary *eventHandlerDictionary = objc_getAssociatedObject(self,&ObjectSingleObjectDictionary);    if(eventHandlerDictionary == nil)        return;        void(^block)(id object) =  [eventHandlerDictionary objectForKey:identifier];    block(object);}//=========================const char CellRowHeightKey;- (float)cellRowHeight{    NSNumber *number = objc_getAssociatedObject(self,&CellRowHeightKey);    if(number == nil) return -1;    return [number floatValue];}- (void)setCellRowHeight:(float)height{    objc_setAssociatedObject(self,                             &CellRowHeightKey,                             [NSNumber numberWithFloat:height],                             OBJC_ASSOCIATION_RETAIN);}@end

参考:https://github.com/zhangxigithub/BlockUI

   https://github.com/pandamonia/BlocksKit

	
				
		
原创粉丝点击