由于TT原班人馬離職,文章丟失,暫留備份
轉載地址http://www.tuicool.com/articles/ymUbaaA
隊長、大隊長都不在加上今天又比較空,偷偷的繼續寫mac TT開發點點滴滴的blog,一般人我不告訴他~~_
在開始本博文之前先翻出一個老概念——閉包(closure),相信同學們都聽過用過并且有自己的理解,在各種開發語言中(JavaScript、c++,oc、lua等 )都能找到對閉包不同程度的支持。oc中的閉包是用block實現的
,c++ 11中的閉包可以用lambda表達式來實現
。ps:同學們可以膜拜下這篇文章—— http://coolshell.cn/articles/8309.html
DDLogic框架(系列博文第一部分講解內容)有個任務執行池
里面裝的是一個個等待執行的task,第一個版本是這樣push一個任務的:
-(BOOL) pushTask:(id<DDTaskProtocol>)task delegate:(id<DDTaskDelegate>) delegate;
調用方例子:
- 1.先要創建一個task執行類:
@interface DDTestTask : NSObject<DDTaskProtocol>
-(void) execute;
@end
- 2.調用的地方需要創建實例,然后pushTask進去
DDTestTask * task = [[DDTestTask alloc] init];
[[DDLogic instance] pushTask:task delegate:nil];
曾近用c++ 98也寫過類似的機制和mac端的第一版本是類似的:也貼個示例代碼吧(番茄雞蛋莫要砸過來哦,我不是沒營養的貼碼一族~~):
/**
* 發起一個Task到任務隊列中(放入容器的task對象實例不需要自己釋放)
*
* @param ITask * pTask
* @return void
*/
virtual LogicErrorCode pushTask(IN ITask* pTask) = 0;
調用方的例子也是類似的:
- 1.先創建一個task執行類:
class TestTask : public logic::ITask
{
public:
virtual void execute();
virtual void release();
}
- 2.調用的地方需要創建實例,然后pushTask進去
TestTask* pTask = new TestTask();
logic::GetLogic()->pushTask(pTask);
回頭看看是不是略蛋疼呢?為了執行一段execute()的任務代碼,需要額外做腫么多事情:
- 1 定義一個類文件來編寫task執行的任務類
- 2 在pushtask的地方要實例化這個task類
- 3 c++中執行完任務后還要記得釋放任務對象資源。那么有沒有更好的方法來簡化這些重復的工作量呢,答案是肯定!
c++、oc語言都有相應的解決方案。oc用block,c++ 11用lambda都可以完美的解決。 同樣我貼段代碼吧,DDLogic框架的task v2:
typedef void(^TaskBlock)();
-(BOOL) pushTaskWithBlock:(TaskBlock)taskBlock;
調用方例子:
[[DDLogic instance] pushTaskWithBlock:
^
{
//讓task 跑一會兒...
}];
c++ 11 用lambda表達式做法也類似,如下:
void pushTaskWithLambda(std::function<void ()> taskRun)
{
taskRun();
}
調用方的例子:
logic::GetLogic()->pushTaskWithLambda(
[]()
{
//讓task 跑一會兒...
}
);
——————————————————————————————————————————————————
以上通過直接把任務執行代碼和pushTask調用的地方放在一起,是不是感覺讓你的重復代碼量、文件數倍減呢?oc block、c++ lambda的用法還可以有很多,比如oc block可以作為callback可以把你的整個程序流程封裝在一個塊里面,作為delegate也可以把流程封裝在一個塊里面,
舉個AFNetworking使用的例子:
-(void)requestWithUri:(NSString *)uri params:(NSDictionary *)params method:(NSString *)method success:(SuccessBlock)success failure:(FailureBlock)failure
{
// success block
void (^responseSuccess)(AFHTTPRequestOperation*, id) = ^(AFHTTPRequestOperation *operation, id responseObject)
{
//http成功的callback block
};
// failure block
void (^failureResponse)(AFHTTPRequestOperation *, NSError *) = ^(AFHTTPRequestOperation *operation, NSError *error)
{
//http失敗的 callback block
};
AFHTTPRequestOperation *operation = [_httpClient HTTPRequestOperationWithRequest:request success: responseSuccess failure:failureResponse ];
[_httpClient enqueueHTTPRequestOperation:operation];
}
關于block的用法完整用法,同學們可以看下這個篇博文( http://blog.csdn.net/jy578154186_/article/details/8664129 )講的蠻詳細的~~