在睡眠模式下使用NsoperationQueue获取数据

时间:2015-11-11 12:10:11

标签: ios

I have added data fetching operations to NSOperationQueue .During the process, I just put the device to sleep mode and the process gets stopped. I surfed stack overflow an get some basic ideas.I need help to continue my fetching process without any interruption when device moves to sleep mode.Help appreciated !!


    NSManagedObjectContext *managedObjectContext=((AppDelegate *)[[UIApplication sharedApplication] delegate]).managedObjectContext;

    NSOperationQueue *downLoadQueue=((AppDelegate *)[[UIApplication sharedApplication] delegate]).downloadqueue;

//获取操作

        if([fetchqueue count]>0)
        {
            Queue *queue=[fetchqueue objectAtIndex:0];

            queue.status=@"INP";
            [managedObjectContext performBlockAndWait:^{
                NSError * error = nil;
                if (![managedObjectContext save:&error]){
                    NSLog(@"Unresolved error while loading3");

                }
            }];

            DownloadOperation *downloadOp=[[DownloadOperation alloc]init];
            downloadOp.queue=queue;
            [downLoadQueue addOperation:downloadOp];

        }
    }


The downLoadQueue started its execution. It is fetching data from server meanwhile the device goes to sleep and the execution stops. I don't know how to continue in this block applicationDidEnterBackground. How can I get my lengthy downloading process during sleep mode?


Also tried this one..But the operation was not resumed.

//代码如下 - (void)applicationDidEnterBackground:(UIApplication *)应用程序     {         //启动长时间运行的任务并立即返回。         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^ {

        NSOperationQueue *downLoadQueue;
        downLoadQueue=((AppDelegate *)[[UIApplication sharedApplication] delegate]).downloadqueue;

        [downLoadQueue waitUntilAllOperationsAreFinished]; 

    });
}

Please suggest any ideas.

1 个答案:

答案 0 :(得分:0)

我认为执行此操作的唯一方法是后台任务。看看apple docs about this。 stackowerflow上还有很多答案如何实现这样的功能。

我认为在您的情况下,您可以尝试使用下一代码在backgraund任务中执行NSOperations a:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{
        // Clean up any unfinished task business by marking where you
        // stopped or ending the task outright.
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

    // Start the long-running task and return immediately.

    //Start your NSOperationQueue if it's not executing
    //Lock current thread while operations are executing
    [queue waitUntilAllOperationsAreFinished]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // Do the work associated with the task, preferably in chunks.

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