ioscore-datasingletonuibackgroundtask

iOS: background process and singleton


In my app I should populate a core data DB and I want do it also in background

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) { //Check if our iOS version supports multitasking I.E iOS 4
        if ([[UIDevice currentDevice] isMultitaskingSupported]) { //Check if device supports mulitasking
            UIApplication *application = [UIApplication sharedApplication]; //Get the shared application instance

            __block UIBackgroundTaskIdentifier background_task; //Create a task object

            background_task = [application beginBackgroundTaskWithExpirationHandler: ^ {
                [application endBackgroundTask: background_task]; //Tell the system that we are done with the tasks
                background_task = UIBackgroundTaskInvalid; //Set the task to be invalid

                //System will be shutting down the app at any point in time now
            }];

            //Background tasks require you to use asyncrous tasks

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                //Perform your tasks that your application requires

                DBSync *sync = [DBSync sharedInstance];

                [sync startDownloadDataandUpdateDB];

                [application endBackgroundTask: background_task]; //End the task so the system knows that you are done with what you need to perform
                background_task = UIBackgroundTaskInvalid; //Invalidate the background_task
            });
        }
    }
}

the problem is that the method "startDownloadDataandUpdateDB" is called, but this method call other method in DBSync but these others methods don't work, I don't understand


Solution

  • I believe it is not really good practice to make network calls in that method.

    The documentation states that you have approximately five seconds to perform any tasks and return.

    You might want to take a look to beginBackgroundTaskWithExpirationHandler