IOS app最小化之后 打開刷新界面

業務場景

今天和朋友在群里討論,他說需要在app最小化回來之后 刷新當前頁面,也就是再次網絡請求。

方案

  • 1 每個界面注冊通知,收到通知掉起網絡,然后在appdelegate 最小化時候發送通知。
  • 2 還是用通知,寫一個基類,所有controller繼承refreshNewWork方法
  • 3 沒想到...??

第一種方法當我們頁面特別多得時候 顯然有點不合理了,目前看起來第二種方案好像還可以。

首先看baseviewController方法

 [self recieveDefaultcenter];
//通知
- (void)recieveDefaultcenter{
    NSNotificationCenter *notiCenter = [NSNotificationCenter defaultCenter];
    
    [notiCenter addObserver:self selector:@selector(receiveNotification:) name:@"refreshNetWork" object:nil];

}
- (void)receiveNotification:(NSNotification *)notify{
    
    [self getCurrentViewController];
    
}
- (void)getCurrentViewController{
    
    UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
    
    UIViewController *currentVC = [self getCurrentVCFrom:rootViewController];
    
    NSLog(@"當前controller%@",[currentVC class]);
    NSString *className = [NSString stringWithFormat:@"%@",[currentVC class]];
    
    ViewControllerConst *viewConst = [ViewControllerConst shareViewConst];
    NSArray *arr = [viewConst registViewControllers];
    for (int i = 0; i<arr.count; i++) {
        
        if ([className isEqualToString:arr[i]]) {
            
            viewConst.isRefresh = YES;
        }
    }
    
    [self refreshNewWork:className isRefresh:viewConst.isRefresh];

}
-(void)refreshNewWork:(NSString *)className isRefresh:(BOOL)isRefresh{



}
- (UIViewController *)getCurrentVCFrom:(UIViewController *)rootVC
{
    UIViewController *currentVC;
    
    if ([rootVC presentedViewController]) {
        // 視圖是被presented出來的
        
        rootVC = [rootVC presentedViewController];
    }
    
    if ([rootVC isKindOfClass:[UITabBarController class]]) {
        // 根視圖為UITabBarController
        
        currentVC = [self getCurrentVCFrom:[(UITabBarController *)rootVC selectedViewController]];
        
    } else if ([rootVC isKindOfClass:[UINavigationController class]]){
        // 根視圖為UINavigationController
        
        currentVC = [self getCurrentVCFrom:[(UINavigationController *)rootVC visibleViewController]];
        
    } else {
        // 根視圖為非導航類
        
        currentVC = rootVC;
    }
    
    return currentVC;
}

viewconst 是我建的一個類

4B46630E-39A3-4CD8-9D4E-AC8B1EC6F07A.png

想通過這個類 去過濾獲取到的viewcontroller

本來想這樣搞

    ViewControllerConst *viewConst = [ViewControllerConst shareViewConst];
    NSArray *arr = [viewConst registViewControllers];
    for (int i = 0; i<arr.count; i++) {
        
        if ([className isEqualToString:arr[i]]) {
            
            viewConst.isRefresh = YES;
        }
    }
    
    [self refreshNewWork:className isRefresh:viewConst.isRefresh];

這個過濾 有問題 永遠會是yes 所以卡在這了

然后我在子類里面過濾了

-(void)refreshNewWork:(NSString *)className isRefresh:(BOOL)isRefresh{
 
    NSString *currenClass = [NSString stringWithFormat:@"%@",[self class]];
    if ([currenClass isEqualToString:className]) {
        
        NSLog(@"首頁刷新");
    }
    
}

為什么要判定,如果不判定 當我點擊第二個界面最小化之后 第一個界面 還是會走刷新方法。

想知道各位有沒有什么好的方法實現.

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

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,466評論 25 708
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,973評論 19 139
  • 昨天晚上我做了一個很奇怪的夢,我夢到我住在一個醫院里面,我的老師是一位年長男性,他也住在醫院里面。我們住在一棟樓房...
    百合兒閱讀 191評論 0 0
  • 磁盤緩存:比喻為每天都要用錢,而如果每次都去銀行取錢,會很不方便。但是帶上個幾百塊錢在身上,就會很方便。 地址映射...
    我是一個好人嗎閱讀 236評論 0 0
  • 在夜里,天很陰沉 看見你躲著月亮 我躲著你,把自己 交給心虛的機緣 忐忑不安,高大的黑影 將你擋在鏡子里面 四目相...
    ChocOne閱讀 246評論 0 0