【iOS】代理傳值與塊代碼傳值,ios代理傳代碼

來源:互聯網
上載者:User

【iOS】代理傳值與塊代碼傳值,ios代理傳代碼

主線程與子線程經常需要進行資料的傳遞,不同的類之間,不同的控制器之間都需要。

而且經常需要監聽一個動作的完成,而後才去做相應事件。(代理是一對一的關係)。


一、代理傳值

代理是一種設計模式。iOS中用的非常多。可以通過自訂代理來進行傳值。

參見我的這篇文章 http://blog.csdn.net/xn4545945/article/details/31036523

在iOS中,委託方與被委託方都要實現3個步驟。(見代碼注釋)

下面代碼:類比下載完成後需要更新UI. 用代理來傳值.


XNUpload.h

#import <Foundation/Foundation.h>//1.定義代理協議@protocol XNUploadDelegate <NSObject>- (void)downloadFinshed:(NSString *)param;@end@interface XNUpload : NSObject//2.定義代理屬性@property (nonatomic, assign) id <XNUploadDelegate> delegate;-(void)download;@end

XNUpload.m

#import "XNUpload.h"@implementation XNUpload/** *  類比下載完成後需要更新UI */- (void)download {NSLog(@"正在下載....");sleep(3.0);NSLog(@"下載完成!");//3.往主線程中更新UI, 需要傳遞參數. 通知主線程下載完成. (調用代理方法)[self.delegate downloadFinshed:@"下載完成啦!"];}@end

XNViewController.m

#import "XNViewController.h"#import "XNUpload.h"@interface XNViewController () <XNUploadDelegate> //1. 遵守代理協議@end@implementation XNViewController- (void)viewDidLoad {[super viewDidLoad];XNUpload *upload = [[XNUpload alloc] init];[upload download];   //下載了//2. 設定代理upload.delegate = self;}//3.實現代理方法. 這個方法裡面就表明下載完成了.- (void)downloadFinshed:(NSString *)param {NSLog(@"%@", param);}@end

二、塊代碼傳值

塊代碼傳值更加簡便,且代碼更加緊湊,更方便。多線程中用塊代碼更加普遍。

使用注意 :1.當不設定block而傳入nil時,會報野指標excbadaccess. (解決:判斷一下,if(xx){..})2.block中執行應該回主線程去更新UI,到裡面dispatch一下.3.蘋果建議所有的塊代碼定義都不要放在標頭檔中.(解決:直接在使用塊代碼的來個匿名的就OK)*好處:能避免自己定義的塊代碼名與蘋果內建的衝突重名.
代碼如下:XNUpload.h
#import <Foundation/Foundation.h>@interface XNUpload : NSObject- (void)download:(void (^)(NSString *param))completion;@end

XNUpload.m

#import "XNUpload.h"@implementation XNUpload/** *  類比下載完成後需要更新UI. 使用塊代碼. */- (void)download:(void (^)(NSString *param))completion { //1.在參數中定義塊代碼NSLog(@"正在下載....");sleep(3.0);NSLog(@"下載完成!");//往主線程中更新UI, 需要傳遞參數. 通知主線程下載完成. (使用塊代碼)if (completion) {//這樣可以讓調用者不用關心線程問題dispatch_async(dispatch_get_main_queue(), ^{    completion(@"下載完成!");  //2.執行塊代碼});}}@end

XNViewController.m

#import "XNViewController.h"#import "XNUpload.h"@interface XNViewController ()@end@implementation XNViewController- (void)viewDidLoad {[super viewDidLoad];XNUpload *upload = [[XNUpload alloc] init];//直接調用方法即可[upload download: ^(NSString *param) {    NSLog(@"%@", [NSThread currentThread]);    NSLog(@"%@", param);}];}@end

塊代碼與代理比較,用起來簡單很多,很方便。


轉載請註明出處:http://blog.csdn.net/xn4545945  



IOS協議傳值 從第一個頁面到第二個頁面

用什麼做的頁面?代碼寫的 還是storyboard做的?用storyboard開發 頁面間的傳值最簡單。。用代碼寫的話 傳值要在push之前 進行傳值
 
iOS int轉成nsstring之後,nsstring當參數傳值時錯誤

調用的方法一塊打出來啊,還有程式報錯,是編譯錯誤,還是運行錯誤啊,你想你這代碼如果用上一句每次那個str的值都變了,而下面一句,那個str就是一個常量字串,所以是不是調用方法有什麼局限性導致的錯誤啊。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.