iOS 定時(shí)刷新

有一個(gè)這樣的需求,例如要求我們每天晚上12點(diǎn)的時(shí)候,刷新一次。

問題就來了:
1、怎樣定時(shí)刷新?用本地通知?還是后臺給予消息?
2、每一個(gè)國家的時(shí)間不同,是否要注意什么?

那我就帶著問題去思考這個(gè)問題?
1、本地通知是可以很好的去實(shí)行,但是假如用戶把推送關(guān)掉了,反正我一般的應(yīng)用都是關(guān)掉推送的。所以這個(gè)并不能很好的解決這個(gè)問題。
2、后臺給予消息,每天在同一個(gè)時(shí)間給出來,也不太可能,并不是長鏈接嘛
3、我想此時(shí),我們應(yīng)該可以換一種思維,每次啟動(dòng)后,我們不都是刷新嘛,就算用戶在那個(gè)時(shí)間點(diǎn),我們簡單的加一個(gè)時(shí)間判斷就好了,假如時(shí)間是在12:00,就異步執(zhí)行這個(gè)操作就好了。
4、至于每一個(gè)國家,時(shí)間是可以設(shè)置時(shí)區(qū)的。

根據(jù)以上的問題回顧了下本地推送和定時(shí)操作。

本地推送
// 注冊
 if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]){
       [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
 }
//注冊本地化
// 初始化本地通知 
UILocalNotification *localNotification = [[UILocalNotification alloc] init]; 
// 通知觸發(fā)時(shí)間 
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:3];

// 這邊可以設(shè)置很多屬性,alertBody userInfo
// userinfo  可以設(shè)置 key value

 // 注冊本地通知
 [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
//接收本地通知(APPDelegate)
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { 
    // 接收后想做的事件
}
//1、移除本地通知
[[UIApplication sharedApplication] cancelAllLocalNotifications];

//2、注意移除 某個(gè)
// 取出全部本地通知 
NSArray *notifications = [UIApplication sharedApplication].scheduledLocalNotifications; 
// 設(shè)置要移除的通知id
 NSString *notificationId = @"idOne"; 
// 遍歷進(jìn)行移除 
for (UILocalNotification *localNotification in notifications)  { 
        // 將每個(gè)通知的id取出來進(jìn)行對比 
        if ([[localNotification.userInfo objectForKey:@"id"] isEqualToString:notificationId])
        { 
           // 移除我們指定的那個(gè)通知 
            [[UIApplication sharedApplication] cancelLocalNotification:localNotification]; 
        } 
}

注意 :一個(gè)App中,本地通知數(shù)量最多64個(gè),不用的通知要及時(shí)移除;記住添加了,就要及時(shí)移除的習(xí)慣。

定時(shí)的三種方法
// 3s后自動(dòng)調(diào)用self的doSomething方法
[self performSelector:@selector(doSomething) withObject:nil afterDelay:3];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     // 3s后自動(dòng)執(zhí)行這個(gè)block里面的代碼 
});
// 3s 后自動(dòng)調(diào)用self的doSome方法
[NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(doSome) userInfo:nil repeats:NO];

// 還得經(jīng)常注意  滑動(dòng)的時(shí)候
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

此時(shí)接著想到了那個(gè)問題,發(fā)現(xiàn)假如那個(gè)定時(shí)刷新的頁面,在我們需要的那個(gè)時(shí)間處于后臺,而且沒有被殺死,用戶又馬上回來啦,此時(shí)立馬想到兩個(gè)問題啦:

  • 1、此時(shí)這種情況是刷新不到的我們的任務(wù)的。
  • 2、那個(gè)頁面總是在核對時(shí)間是有問題的,肯定是有問題的。

所以重新想,有沒有更好的方法呢?繼續(xù)思考下,一個(gè)雞賊的方法,每次進(jìn)入系統(tǒng)的時(shí)候,判斷一下是不是當(dāng)天距離那個(gè)時(shí)間點(diǎn)之后的第一次進(jìn)入,如果是,則系統(tǒng)通知下,需要刷新的地方刷新,貌似問題就這樣解決了。如有好的方法歡迎告知,哈哈。

備注:

回顧通知這塊的知識,看了下iOS開發(fā)系列--通知與消息機(jī)制非常詳細(xì)。

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

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,227評論 25 708
  • 極光推送: 1.JPush當(dāng)前版本是1.8.2,其SDK的開發(fā)除了正常的功能完善和擴(kuò)展外也緊隨蘋果官方的步伐,SD...
    Isspace閱讀 6,778評論 10 16
  • 推送通知 注意:這里說的推送通知跟NSNotification有所區(qū)別 NSNotification是抽象的,不可...
    iOS開發(fā)攻城獅閱讀 4,303評論 1 13
  • 幸福是需要修出來的#每天進(jìn)步1%,幸福12班,20-王青青—晉江 【幸福三朵玫瑰】 回老家看可樂太奶奶們? 休息 ...
    王青青幸福實(shí)修者閱讀 183評論 0 2
  • 蒙古人的崛起,是東方在歷史上影響世界的最大事件。 忽必烈的元帝國是蒙古帝國的最東的四分之一。雖然從血脈上來說忽必烈...
    haywirehouse閱讀 127評論 0 0