- block是iOS4.0時才出現(xiàn)的技術(shù)
一.閉包
- 網(wǎng)絡(luò)請求工具類,封裝方法時,把閉包當參數(shù)封裝,并在內(nèi)部執(zhí)行,這樣外面就能拿到閉包的參數(shù),相當用傳值了
import UIKit
import AFNetworking
enum RequestType {
case GET
case POST
}
class NetworkTools: AFHTTPSessionManager {
// 1.將NetworkTools設(shè)置成單例
static let shareIntance : NetworkTools = {
let tools = NetworkTools()
tools.responseSerializer.acceptableContentTypes?.insert("text/html")
return tools
}()
}
// MARK:- 封裝網(wǎng)絡(luò)請求
extension NetworkTools {
func request(requestType : RequestType, urlString : String, parameters : [String : AnyObject], finished : (result : AnyObject?, error : NSError?) -> ()) {
// 1.定義成功后的閉包
let successCallBack = { (task : NSURLSessionDataTask, result : AnyObject?) -> Void in
finished(result: result, error: nil)
}
// 2.定義失敗后的閉包
let failureCallBack = { (task : NSURLSessionDataTask?, error : NSError) -> Void in
finished(result: nil, error: error)
}
// 3.發(fā)送網(wǎng)絡(luò)請求
if requestType == .GET {
GET(urlString, parameters: parameters, progress: nil, success: successCallBack, failure: failureCallBack)
} else {
POST(urlString, parameters: parameters, progress: nil, success: successCallBack, failure: failureCallBack)
}
}
}
- 使用: 看下段代碼第3條,調(diào)用上面封裝方法時就相當于拿到了數(shù)據(jù)
// MARK:- 請求首頁數(shù)據(jù)
extension NetworkTools {
func loadHomeData(finished : (result : [[String : AnyObject]]?, error : NSError?) -> ()) {
// 1.獲取請求的URLString
let urlString = "http://mobapi.meilishuo.com/2.0/twitter/popular.json"
// 2.獲取請求的參數(shù)
let parameters = ["offset" : "0", "limit" : "30", "access_token" : "b92e0c6fd3ca919d3e7547d446d9a8c2"]
// 3.發(fā)送網(wǎng)絡(luò)請求
request(.GET, urlString: urlString, parameters: parameters) { (result, error) -> () in
/**********此處就可以拿到閉包的參數(shù),就相當于把數(shù)據(jù)傳出來了******/
// 1.判斷是否有錯誤
if error != nil {
finished(result: nil, error: error)
}
// 2.獲取結(jié)果
guard let result = result as? [String : AnyObject] else {
finished(result: nil, error: NSError(domain: "data error", code: -1011, userInfo: nil))
return
}
// 3.將結(jié)果回調(diào)
finished(result: result["data"] as? [[String : AnyObject]] , error: nil)
}
}
}
二. 代理
- HostView
#import <UIKit/UIKit.h>
@protocol HostViewDelegate <NSObject>
- (void)pushViewControllerWith:(UIButton *)btn;
@end
@interface HostView : UIView
@property (nonatomic, weak) id<HostViewDelegate>Delegate;
@end
- (void)clickButtonWith:(UIButton *)btn
{
//int tag = (int)btn.tag;
// self.block(tag); //此處是block寫法
if ([self.Delegate respondsToSelector:@selector(pushViewControllerWith:)] ) {
[self.Delegate pushViewControllerWith:btn];
}
}
- 另一個控制器MineViewController中,這樣就拿到傳遞過來的tag值
@interface MineViewController ()<HostViewDelegate>
hostView.Delegate = self;
- (void)pushViewControllerWith:(UIButton *)btn
{
UIViewController *vc = self.controllerArray[btn.tag];
NSLog(@"%@+++++++",vc);
[self.navigationController pushViewController:vc animated:YES];
}
三. block
3.1思想
-
A類中有個屬性block,block帶一個參數(shù),
- 并在A類就執(zhí)行了block(a)
B類中 要跳轉(zhuǎn)控制器到A類的控制器, 使用
A.block(int) = ^(int a){
這樣 在此括號里就能拿到 A 類傳遞過來的a值 ,實現(xiàn)了代理傳值方法
}
3.2實例
- HostView中
#import <UIKit/UIKit.h>
//@protocol HostViewDelegate <NSObject>
//
//- (void)pushViewControllerWith:(UIButton *)btn;
//
//@end
@interface HostView : UIView
//@property (nonatomic, weak) id<HostViewDelegate>Delegate;
@property (nonatomic, strong) void(^block)(int);
@end
- (void)clickButtonWith:(UIButton *)btn
{
int tag = (int)btn.tag;
self.block(tag);
// if ([self.Delegate //此處是delegate寫法 respondsToSelector:@selector(pushViewControllerWith:)] ) {
// [self.Delegate pushViewControllerWith:btn];
// }
}
- 另一個控制器MineViewController中,這樣就拿到傳遞過來的tag值
hostView.block = ^( int tag ){
UIViewController *vc = self.controllerArray[tag];
NSLog(@"%@+++++++",vc);
[self.navigationController pushViewController:vc animated:YES];
};