ios - 当我的应用程序进入后台时,我可以在 dispatch_async 中加入一个循环吗?

标签 ios objective-c uilocalnotification core-telephony

我想为 iOS 构建一个应用程序。这个想法是在调用状态为 Connected 时启动 UILocalNotification。我尝试在方法 applicationDidEnterBackground 中使用 dispatch_async 一个 block ,然后在这个 block 中放入一个循环 while(!isConnected) 来知道什么时候应该UILocalNotificacion 被启动。该循环检查调用状态并决定何时启动通知。

我需要知道的是,这是解决我的问题的正确方法吗?或者有人有更好的主意吗?

好的,这是我的代码:

- (void)applicationDidEnterBackground:(UIApplication *)application
 {

// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
isAlive = YES;

NSLog(@"BackgroundTimerRemaining %f", [application backgroundTimeRemaining]);

// verufy status of call
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
    // Clean up any unfinished task business by marking where you
    // stopped or ending the task outright.
    [application endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
}];

[self readLocalVariableCalling];

__block int connected = 0;

__block int callingTemp = 1;//((NSNumber*)[self.datos objectForKey:@"calling"]).intValue;
NSLog(@"callingTemp: %d", callingTemp);

__strong typeof(self) weakSelf = self;

// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    @autoreleasepool
    {
        //isAlive = YES;
        // Do the work associated with the task, preferably in chunks.
        while (callingTemp == 1)
        {
            if (callCenter != nil)
            {

            callCenter.callEventHandler = ^(CTCall* call)
            {
                NSLog(@"Loop - Call EventHandler state: %@", call.callState);
                if([call.callState isEqualToString:CTCallStateDisconnected])
                {

                    NSLog(@"disconnected");
                    [[UIApplication sharedApplication] cancelAllLocalNotifications];
                    callingTemp = 0;
                    connected = 0;
                    [weakSelf.datos setObject:[NSNumber numberWithInt:0] forKey:@"calling"];
                    [weakSelf saveLocalVariableCalling];

                }
                if ([call.callState isEqualToString:CTCallStateDialing] &&
                    connected == 0)
                {
                    NSLog(@"connected - Call EventHandler state : %@", call.callState);
                    connected = 1;
                    if (callingTemp == 1
                        && weakSelf.timerTableViewController.currentTimer)
                    {

                        TimeDto *currentTimer = weakSelf.timerTableViewController.currentTimer;
                        NSInteger seconds = currentTimer.value.intValue;

                        NSLog(@"minutos a segundos = %d", seconds);

                        NSDate *alertTime = [[NSDate date] dateByAddingTimeInterval:seconds];
                        UIApplication* app = [UIApplication sharedApplication];

                        if (weakSelf.notifyAlarm)
                        {
                            weakSelf.notifyAlarm.fireDate = alertTime;
                            weakSelf.notifyAlarm.timeZone = [NSTimeZone defaultTimeZone];
                            weakSelf.notifyAlarm.repeatInterval = 0;
                            weakSelf.notifyAlarm.soundName = @"road.caf";

                            NSString *messageTimer = NSLocalizedString(@"messageTimer", nil);
                            weakSelf.notifyAlarm.alertBody = [NSString stringWithFormat:messageTimer, ((int)currentTimer.value.intValue / 60 ) , (currentTimer.value.intValue % 60)];

                            [app scheduleLocalNotification:weakSelf.notifyAlarm];
                        }
                    }
                }


            };
            }
            else
            {
                NSLog(@"callCenter is null");
            }
            //NSLog(@"loop call state");

        }

        NSLog(@"Call Finished");


        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }

});
}

最佳答案

无论您如何安排工作,一旦您的应用程序进入后台,在所有事件停止之前,它只允许进行一定数量的进一步处理。尝试 dispatch_async 不会神奇地为您带来永久的多任务处理。

所以,不,我不认为这可以解决您的问题。

关于ios - 当我的应用程序进入后台时,我可以在 dispatch_async 中加入一个循环吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16951631/

相关文章:

iOS 崩溃,EXC_BREAKPOINT,Xcode 6.1 无线索

ios - 启动画面以倒置方式出现?

ios - 如何让两个 iOS 应用共享 plist?

ios - 正确处理启动选项和本地通知

ios - UILocalNotification 在整个星期的特定时间触发,除了 1 天

ios - 从 UITabBarController 呈现 ViewController 标签

ios - 为什么使用self.propertyname而不是_propertyname设置我的属性为零

ios - 如何将 NSMutableArray 值共享给 MFMailComposeViewController

objective-c - 从通知中心删除 UILocalNotifications

ios - 将 iOS Facebook 身份验证凭据推送到 Web View