閉包 * block * 代理 * 使用實例

  • block是iOS4.0時才出現的技術

一.閉包

  • 網絡請求工具類,封裝方法時,把閉包當參數封裝,并在內部執行,這樣外面就能拿到閉包的參數,相當用傳值了
import UIKit
import AFNetworking

enum RequestType {
    case GET
    case POST
}

class NetworkTools: AFHTTPSessionManager {
    // 1.將NetworkTools設置成單例
    static let shareIntance : NetworkTools = {
        let tools = NetworkTools()
        
        tools.responseSerializer.acceptableContentTypes?.insert("text/html")
        
        return tools
    }()
}
// MARK:- 封裝網絡請求
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.發送網絡請求
        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條,調用上面封裝方法時就相當于拿到了數據

// MARK:- 請求首頁數據
extension NetworkTools {
    func loadHomeData(finished : (result : [[String : AnyObject]]?, error : NSError?) -> ()) {
        // 1.獲取請求的URLString
        let urlString = "http://mobapi.meilishuo.com/2.0/twitter/popular.json"
        
        // 2.獲取請求的參數
        let parameters = ["offset" : "0", "limit" : "30", "access_token" : "b92e0c6fd3ca919d3e7547d446d9a8c2"]
        
        // 3.發送網絡請求
        request(.GET, urlString: urlString, parameters: parameters) { (result, error) -> () in

/**********此處就可以拿到閉包的參數,就相當于把數據傳出來了******/
            // 1.判斷是否有錯誤
            if error != nil {
                finished(result: nil, error: error)
            }
            
            // 2.獲取結果
            guard let result = result as? [String : AnyObject] else {
                finished(result: nil, error: NSError(domain: "data error", code: -1011, userInfo: nil))
                return
            }
            
            // 3.將結果回調
            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帶一個參數,

    • 并在A類就執行了block(a)
  • B類中 要跳轉控制器到A類的控制器, 使用

 A.block(int) = ^(int a){
      這樣 在此括號里就能拿到 A 類傳遞過來的a值 ,實現了代理傳值方法
}

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];
    };
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • 國家電網公司企業標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,184評論 6 13
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,217評論 30 472
  • AFHTTPRequestOperationManager 網絡傳輸協議UDP、TCP、Http、Socket、X...
    Carden閱讀 4,403評論 0 12