- 前一段時(shí)間做了一個(gè)倒計(jì)時(shí)的功能,要求每個(gè)tableViewcell里面都嵌入倒計(jì)時(shí)的功能。我也封裝了一個(gè)工具類,詳細(xì)請(qǐng)看這里
- 但是倒計(jì)時(shí)如果不是用服務(wù)器的現(xiàn)在時(shí)間進(jìn)行剩余時(shí)間計(jì)算的話,就可能出現(xiàn)bug
(比如一個(gè)商品,倒計(jì)時(shí)1小時(shí)停售,服務(wù)器已經(jīng)過了這停售時(shí)間,從而停售了,但是客戶端的時(shí)間比服務(wù)器時(shí)間向后調(diào)了1小時(shí),那么客戶端就會(huì)以為還沒有停售)
- 這就要求要用客戶端的時(shí)間求出服務(wù)器的時(shí)間
1、大體思路
其實(shí)很簡(jiǎn)單就說一下大體的思路,在附一個(gè)小的工具類,很簡(jiǎn)單。。。
- 封裝一個(gè)類,在請(qǐng)求到后臺(tái)的時(shí)間戳后,把本地時(shí)間與后臺(tái)時(shí)間戳進(jìn)行對(duì)比,記錄時(shí)間差,最后每次時(shí)間計(jì)算的時(shí)候,都可以用本地時(shí)間求出服務(wù)器的時(shí)間。
- 關(guān)鍵是什么時(shí)候請(qǐng)求服務(wù)器時(shí)間。
1.我們先分析一下,首先,這種時(shí)間差,越早知道越好,所以,在app啟動(dòng)的時(shí)候就要請(qǐng)求服務(wù)器時(shí)間,并計(jì)算差值。
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {}
app剛剛啟動(dòng)的時(shí)候創(chuàng)建并給出serverTime,內(nèi)部計(jì)算了服務(wù)器時(shí)間
2.假設(shè),用戶很調(diào)皮,在app運(yùn)行后,就退出去,對(duì)手機(jī)的時(shí)間設(shè)置成一個(gè)隨意時(shí)間。那再進(jìn)來,再用以前儲(chǔ)存的時(shí)間差計(jì)算服務(wù)器時(shí)間,豈不是炸了。
所以在app進(jìn)入后臺(tái)、應(yīng)用程序編程不激活狀態(tài)、從后臺(tái)進(jìn)入到前臺(tái)等都要調(diào)用一下,一下代碼滿足了這些時(shí)機(jī)的需求
-(void)applicationWillResignActive:(UIApplication *)application {}
應(yīng)用程序變成不激活狀態(tài),雙擊home建,應(yīng)用程序不在相應(yīng)用戶點(diǎn)擊的時(shí)候
-(void)applicationDidEnterBackground:(UIApplication *)application{}
應(yīng)用程序進(jìn)入到后臺(tái)的時(shí)候調(diào)用,雙擊home建不會(huì)調(diào)用
-(void)applicationWillEnterForeground:(UIApplication *)application{}
應(yīng)用程序從后臺(tái)進(jìn)入到前臺(tái)以后調(diào)用這個(gè)方法, 應(yīng)用啟動(dòng)不會(huì)調(diào)用
-(void)applicationDidBecomeActive:(UIApplication *)application{}
應(yīng)用程序變?yōu)榧せ顮顟B(tài)的時(shí)候會(huì)調(diào)用這個(gè)方法,(用戶可以進(jìn)行用戶交互的時(shí)候調(diào)用)
-(void)applicationWillTerminate:(UIApplication *)application{}
系統(tǒng)將要推出(終止)的時(shí)候調(diào)用
2. 代碼剪輯
.h
#import <Foundation/Foundation.h>
@interface PYServerAndClientTime : NSObject
///單利
+ (instancetype) sharedServerAndClientTime;
///內(nèi)部創(chuàng)建了sharedServerAndClientTime對(duì)象
+ (instancetype) serVerAndClientTimeWithServerTime: (NSString *)serverTime;
///服務(wù)器的時(shí)間戳
@property (nonatomic,copy) NSString *serverTime;
///計(jì)算后的服務(wù)器時(shí)間
@property (nonatomic,strong,readonly) NSDate *serverAndClientDate;
///計(jì)算后服務(wù)器時(shí)間的timeInterval
@property (nonatomic,assign,readonly) NSNumber *serverAndClientTimeInterval;
///服務(wù)器與客戶端時(shí)間的時(shí)間差
@property (nonatomic,assign,readonly) NSNumber *timeDifference;
@end
.m
@implementation PYServerAndClientTime
+ (instancetype) sharedServerAndClientTime {
static dispatch_once_t onceToken;
static PYServerAndClientTime *_instance;
dispatch_once(&onceToken, ^{
_instance = [[self alloc]init];
});
return _instance;
}
+(instancetype) serVerAndClientTimeWithServerTime: (NSString *)serverTime {
PYServerAndClientTime *serverAndClientTime = [PYServerAndClientTime sharedServerAndClientTime];
serverAndClientTime.serverTime = serverTime;
return serverAndClientTime;
}
//MARK: setter
-(void)setServerTime:(NSString *)serverTime {
_serverTime = serverTime;
double serverTimeDouble = serverTime.longLongValue;
//計(jì)算當(dāng)前的時(shí)間秒數(shù)
NSTimeInterval currentDateInterval = [[[NSDate alloc]init] timeIntervalSince1970];
//計(jì)算時(shí)差
NSNumber *timeDifferenceTemp = @(serverTimeDouble - currentDateInterval);
[self setValue:timeDifferenceTemp forKey:@"timeDifference"];
}
//MARK: getter
-(NSDate *)serverAndClientDate {
return [NSDate dateWithTimeIntervalSinceNow:self.timeDifference.doubleValue];;
}
-(NSNumber *)serverAndClientTimeInterval {
return @([self.serverAndClientDate timeIntervalSince1970]);
}
@end
appDelegate
#import "AppDelegate.h"
#import "PYServerAndClientTime.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
//根據(jù)服務(wù)器時(shí)間計(jì)算與本地時(shí)間的時(shí)間差
-(void)serverAndClientTime {
/**......
服務(wù)器請(qǐng)求數(shù)據(jù)
.......
*/
NSString *serverTime;//服務(wù)器求情下來之后的服務(wù)器時(shí)間戳
PYServerAndClientTime *serverAndClientTime = [PYServerAndClientTime sharedServerAndClientTime];
serverAndClientTime.serverTime = serverTime;
}
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//app剛剛啟動(dòng)的時(shí)候創(chuàng)建并給出serverTime,內(nèi)部計(jì)算了服務(wù)器時(shí)間
[self serverAndClientTime];
return YES;
}
-(void)applicationWillResignActive:(UIApplication *)application {
// 應(yīng)用程序變成不激活狀態(tài),雙擊home建,應(yīng)用程序不在相應(yīng)用戶點(diǎn)擊的時(shí)候
[self serverAndClientTime];
}
-(void)applicationDidEnterBackground:(UIApplication *)application {
//應(yīng)用程序進(jìn)入到后臺(tái)的時(shí)候調(diào)用,雙擊home建不會(huì)調(diào)用
[self serverAndClientTime];
}
-(void)applicationWillEnterForeground:(UIApplication *)application {
//應(yīng)用程序從后臺(tái)進(jìn)入到前臺(tái)以后調(diào)用這個(gè)方法, 應(yīng)用啟動(dòng)不會(huì)調(diào)用
[self serverAndClientTime];
}
-(void)applicationDidBecomeActive:(UIApplication *)application {
//應(yīng)用程序變?yōu)榧せ顮顟B(tài)的時(shí)候會(huì)調(diào)用這個(gè)方法,(用戶可以進(jìn)行用戶交互的時(shí)候調(diào)用)
[self serverAndClientTime];
}
-(void)applicationWillTerminate:(UIApplication *)application {
//系統(tǒng)將要推出(終止)的時(shí)候調(diào)用
}
@end