¿Cómo llamar al servicio web periódicamente en el iPhone de fondo?

Tengo un servicio web y quiero llamar a este servicio periódicamente desde mi aplicación de iPhone para cobrar los datos cada 1 minuto cuando la aplicación se está ejecutando.

yo suelo NSTemporizador para llamar a la función que llama a este servicio, pero estoy seguro de que la primera llamada terminó de analizar los datos de la primera llamada antes de proceder con una nueva llamada. Entonces, ¿cómo puedo hacer eso?

{
 NSDate *d = [NSDate dateWithTimeIntervalSinceNow: 60.0];
 NSTimer *t = [[NSTimer alloc] initWithFireDate: d
                                      interval: 10
                                        target: self
                                      selector:@selector(calltimer:)
                                      userInfo:nil repeats:YES];

 NSRunLoop *runner = [NSRunLoop currentRunLoop];
 [runner addTimer:t forMode: NSDefaultRunLoopMode];
 [t release];
}

-(void)calltimer :(id)sender
{
    NSLog(@"yessss");

    if(!myQueue)
    {
        myQueue = dispatch_queue_create("supperApp.user1025523.com", NULL);
        dispatch_async(myQueue, ^{
            [self getData]; 
            });
    }    
}

-(void)getData
{
    webserviceCaller* wsCaller = [[webserviceCaller alloc]initWithTarget:self     selector:@selector(parsINVData:)];
    [wsCaller getINventoryData:self.username];
    [wsCaller release];
}

-(void) parsINVData:(InvData*) ret
{
    //save return data in global variable      
}

yo suelo NSMutableURLRequest para iniciar el parámetro de solicitud y NSURLConexión para iniciar la conexión, entonces, ¿por qué no se disparó la llamada al servicio web?

preguntado el 21 de mayo de 12 a las 18:05

Mucho más limpio sería no configurar el temporizador para que se repita. Y luego, cuando recibe o falla (en los métodos delegados de NSURLConnection), puede reprogramar el temporizador. -

2 Respuestas

Puede agregar una variable miembro de nivel de clase como la siguiente:

en archivo .h

{
    BOOL finishedParsing;
}

- (void) nsTimerFunctionCall
{
    if(!finishedParsing)
    {
        //Either return, or recall this same function after some time
        return;
    }

   [self parseCode];
}

- (void) parseCode
{
    finishedParsing = NO;

    //do long processing function
    //....

    finishedParsing = YES;
}

De esta forma, puede asegurarse de que no se llamará al código de análisis mientras se procesa otra llamada a la función.

contestado el 21 de mayo de 12 a las 19:05

Utilice una cola en serie para asegurarse de que una tarea espera a la siguiente.

- (id)init
{
    self = [super init];
    if( !self ) return nil;

    parsing_queue = dispatch_queue_create("superApp.user1025523.com", NULL);

    // etc.

- (void)timerAction: (NSTimer *)tim
{
    // Enqueue the work. Each new block won't run until the 
    // previous one has completed.
    dispatch_async(parsing_queue, ^{
        // Do the work
    });
}

Esto también automáticamente en segundo plano.

contestado el 24 de mayo de 12 a las 19:05

OK, hago lo que dices, pero la función que llama a la URL no llamó al servidor, actualicé la publicación con mi código: user1025523

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.