
圖片1.jpg
2016年06月22日星期三
有時候,我們在想封裝一個帶有block回調的函數(shù),比如常用的AFNetworking,或者Alomfire(名字如果錯了,不要在意),就會有個小問題,函數(shù)是不能通過block返回任何參數(shù)的??梢赃@么理解(至少我現(xiàn)在是這么想的):函數(shù),是同步執(zhí)行的,它在執(zhí)行的時候是不會停下來的。block卻不是這樣的,block相當于是異步執(zhí)行,另外開一個線程去搞這個事情。所以,這就有個問題,當你想封裝帶block的函數(shù),并且獲取到他的block內(nèi)的參數(shù),用函數(shù)是沒有辦法的。函數(shù)已經(jīng)執(zhí)行完畢并且被內(nèi)存釋放掉了,你block才把回調傳過來,這么寫,xcode就會提醒你是不行的。
但是,在看同事代碼的時候,我非常驚喜的發(fā)現(xiàn)(MDZZ)可以在函數(shù)后面跟一個或者幾個block,然后在函數(shù)內(nèi)部,給函數(shù)的block賦予內(nèi)部封裝的block的值。 具體的實現(xiàn)可以參考如下:
-(void)MMhttpService:(NSString *)url parame:(NSDictionary *)parame success:(void (^)(id))success fail:(void (^)(id))failuer{
AFHTTPSessionManager *manage = [AFHTTPSessionManager manager];
manage.requestSerializer.timeoutInterval = 10.0f;//設置10秒后就爆炸
[manage POST:url parameters:parame progress:^(NSProgress * _Nonnull uploadProgress) {
//tudo
NSLog(@"這里執(zhí)行的是progress 代碼塊");
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//通過這個方式,來進行封裝block的參數(shù)外傳
success(responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
failuer(error);
}];
}
實現(xiàn)的時候就是這個牛??樣
MM_NetWorking *mm = [[MM_NetWorking alloc]init];
[mm MMhttpService:@"url" parame:@{} success:^(id response) {
NSLog(@"這是成功的咯%@",response);
} fail:^(id error) {
NSLog(@"這是失敗的咯%@",error);
}];