使用場景
A視圖和B視圖沒有直接跳轉(zhuǎn)關(guān)系,當(dāng)A視圖數(shù)據(jù)發(fā)生改變需要觸發(fā)B視圖的刷新事件,當(dāng)A視圖向B視圖傳遞一些信息,或者修改B視圖的一些界面,或者一些界面?zhèn)髦祮栴},此類問題大部分人都是采用通知去解決,block+單利便可以解決這些問題,同事block+單利還可以去替代代理,通知去處理一些他們無法完成事。
使用步驟
1.創(chuàng)建一個單利對象(單利本身所具備的屬性,以及他的作用也是非常強(qiáng)大的,單利的使用就不過多贅述)
#import "RefreshStatus.h"
@implementation RefreshStatus
static RefreshStatus *manager = nil;
+(RefreshStatus *)SimpleInterest
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[self alloc]init];
});
return manager;
}
@end
2.把block作為單利對象中的一個屬性(一般一個功能來寫一個block)
#import@interface RefreshStatus : NSObject
/**
單利對象
*/
+(RefreshStatus *)SimpleInterest;
/**
資產(chǎn)頁刷新的block
*/
@property(nonatomic,copy) void(^assetRefreshStatue)(id *status);
-(void)RefreshAssetVC:(id *status);//這個方法只是為了方便調(diào)用
@end
-(void)RefreshAssetVC:(id *status)
{
if (self.assetRefreshStatue) {
self.assetRefreshStatue(status);
}
}
到此為止這僅僅只是完成對象的創(chuàng)建,使用的時候也很簡單
3.使用(拿刷新舉例)在需要觸發(fā)刷新的地方來調(diào)用這個block或者直接調(diào)用這個寫好的方法
[[RefreshStatus SimpleInterest] RefreshAssetVC:(@"這里傳你想要傳遞的值,可以為nil")]
4.監(jiān)聽(在你需要刷新的地方監(jiān)聽)
[RefreshStatus SimpleInterest].assetRefreshStatue=^(id *status){
//這里做刷新操作,或者做一些事件的處理
NSLog(@"%@通知資產(chǎn)頁刷新",status);
};
注意
這種方式適用于已存在的兩個對象之間的通訊,如果想用于還未創(chuàng)建的對象的通訊,需要做一些方法的處理。
拓展
block+單利用起來比較方便,如果對block和單利比較熟悉的情況下,結(jié)合起來可以處理很多通知和代理無法實現(xiàn)的功能,同時還可以用于一些登錄流程的邏輯的處理,例如把一個登錄的block作為單利的屬性,在需要登錄的地方去監(jiān)聽,登錄完成就去實現(xiàn)這個block,這樣其他地方的監(jiān)聽就會接收到,同時他還可以存儲一些登錄狀態(tài)或者一些常用的數(shù)據(jù)等等。