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
- NSObject比较实用的Category
- NSObject + NSCoding Category
- UIDevice的一些实用的Category
- category的介绍与简单实用
- NSObject一些比较常用的方法和简单的反射
- NSObject的 load和initialize方法的比较
- 129. NSObject的load和initialize方法比较
- 比较实用的代码
- 比较实用的网址
- 比较实用的网站
- 实用知识:关于通知里面的 category 使用方法
- 几个比较实用的函数
- 比较实用的js集锦
- 比较实用的delphi 技术文章
- 常见比较实用的代码
- 比较实用的 css3属性
- 比较实用的注册表实用工具
- 比较实用的ADT快捷键
- 面向对象—17—运行时异常
- 不使用库函数将整数转换为字符串
- android开发_TimePicker控件
- JDBC连接字符串大全
- [编程之美3.8]求二叉树节点的最大距离
- NSObject比较实用的Category
- dll动态调用和静态调用有什么区别
- 奋斗黑马程序员----Java之网络编程(一)
- phpmyadmin 用户名密码界面
- Android应用层源码阅读笔记
- NIST的安全内容自动化协议(SCAP)以及SCAP中文社区简介
- 注意Hibernate4在开发当中的一些改变
- [编程之美3.9]重建二叉树
- [Android Samples视频系列之ApiDemos] App