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