当应用程序处于前台时,每分钟调用一次服务器

Call the server every minute while app in Foreground

提问人:Tamil_Arya 提问时间:6/2/2016 更新时间:6/2/2016 访问量:384

问:

我想每分钟调用一次我的服务器,而应用程序在前台,此调用不应依赖于任何ViewController类,这是常用方法。

(例如:呼叫我的服务器取决于服务器响应,我想像往常一样显示一些警报)

我只是继续尝试通过应用程序委托方法,但我无法获得任何解决方案。 有没有其他方法或任何方法属于应用程序委托?

iOS 的Objective-C iOS7 Cocos2D-iPhone

评论

0赞 Suraj Sukale 6/2/2016
提供的任何代码将不胜感激。
0赞 Stefan 6/2/2016
放置每分钟触发一次的计时器并执行该方法?
0赞 Tamil_Arya 6/2/2016
-(void)serverCallMethod{ //我的服务器调用代码 } 我想每分钟调用一次,但不应该依赖于任何 Vc 类
0赞 Tamil_Arya 6/2/2016
是的,我们只能使用计时器,但是我应该把方法放在哪里
0赞 Tamil_Arya 6/2/2016
我的代码:Mint_timer = [NSTimer scheduledTimerWithTimeInterval: 10.0 target: self selector: @selector(callAfterSixtySecond:) userInfo: nil repeats: YES];} -(void) callAfterSixtySecond:(NSTimer*) t { UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@“Main” bundle:nil];Mint_Ad_ViewController *viewController = (Mint_Ad_ViewController *)[storyboard instantiateViewControllerWithIdentifier:@“Mint_Ad_ViewController”];[self presentViewController:viewController animated:YES completion:nil];}

答:

-1赞 Sandeep Bhandari 6/2/2016 #1

Tamil_Arya,

您不应该仅仅因为它是单例的,并且在整个应用程序生命周期中都可用,就将所有代码转储到 AppDelegate 中。将所有内容都放在 appdelegate 中会使您的代码变得非常笨拙,并且遵循非常糟糕的设计模式。

遵循 MVC 是一件好事,您可以做以保持代码的可靠性和健壮性。

无论如何,这是你可以做的,

我相信你一定有一个进行网络服务调用的课程。如果没有,请创建一个。singleton

例如,让我们将类称为 和WebService.hWebService.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的回应,如果你只是因为你碰巧看到这个问题而投了反对票,也请解释一下