提问人:Tamil_Arya 提问时间:6/2/2016 更新时间:6/2/2016 访问量:384
当应用程序处于前台时,每分钟调用一次服务器
Call the server every minute while app in Foreground
问:
我想每分钟调用一次我的服务器,而应用程序在前台,此调用不应依赖于任何ViewController类,这是常用方法。
(例如:呼叫我的服务器取决于服务器响应,我想像往常一样显示一些警报)
我只是继续尝试通过应用程序委托方法,但我无法获得任何解决方案。 有没有其他方法或任何方法属于应用程序委托?
答:
-1赞
Sandeep Bhandari
6/2/2016
#1
Tamil_Arya,
您不应该仅仅因为它是单例的,并且在整个应用程序生命周期中都可用,就将所有代码转储到 AppDelegate 中。将所有内容都放在 appdelegate 中会使您的代码变得非常笨拙,并且遵循非常糟糕的设计模式。
遵循 MVC 是一件好事,您可以做以保持代码的可靠性和健壮性。
无论如何,这是你可以做的,
我相信你一定有一个进行网络服务调用的课程。如果没有,请创建一个。singleton
例如,让我们将类称为 和WebService.h
WebService.m
所以你的 WebService.h 应该看起来像
@interface WebService : NSObject
+ (instancetype)shared; //singleton provider method
- (void)startSendPresence; //method you will call to hit your server at regular interval
- (void)stopSendPresence //method you will call to stop hitting
@end
WebService.m 应如下所示
@interface WebService ()
@property (strong, nonatomic) NSTimer *presenceTimer;
@end
@implementation WebService
+ (instancetype)shared
{
static id instance_ = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance_ = [[self alloc] init];
});
return instance_;
}
- (void)startSendPresence {
[self sendPresence:nil]; //to make the first webservice call without waiting for timer to trigger
if(!self.presenceTimer){
self.presenceTimer = [NSTimer scheduledTimerWithTimeInterval:self.presenceTimerInterval target:self selector:@selector(sendPresence:) userInfo:nil repeats:YES];
}
}
- (void)sendPresence:(NSTimer *)timer {
//make your web service call here to hit server
}
- (void)stopSendPresence {
[self.presenceTimer invalidate];
self.presenceTimer = nil;
}
@end
现在,定期命中 Web 服务器的 Web 服务单例类已准备就绪:)现在,当您想要开始点击时,可以在任何您想要的地方调用它,并在想要停止它时调用 stopSendPresence :)
假设您想在应用程序始终出现在前台后立即开始访问服务器(尽管对我来说没有多大意义,希望它对您有意义)
在 AppDelegate.m 中
//this method will be called when you launch app
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[WebService shared] startSendPresence];
}
//this method will be called when you brimg it foreground from background
- (void)applicationWillEnterForeground:(UIApplication *)application {
[[WebService shared] startSendPresence];
}
如果您想在应用进入后台后立即停止点击服务器
- (void)applicationDidEnterBackground:(UIApplication *)application {
[[WebService shared] stopSendPresence];
}
希望这会有所帮助
评论
0赞
Sandeep Bhandari
6/2/2016
@down选民:关心抱怨???“完美的解决方案”,你看这是OP的回应,如果你只是因为你碰巧看到这个问题而投了反对票,也请解释一下
评论