2016-05-19 7 views
1

Ich möchte AFNetworking Anfragen konsequent in einer Warteschlange senden. Ich erstelle eine rekursive Funktion, wie unten für dieses Ziel:rekursive Funktion get "Variable ist nicht zuweisbar (fehlende __Block Typspezifizierer) Fehler"

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    NSLog(@"Start ..."); 

    [self sentTest:0]; 
} 

- (void) sentTest:(int)i{ 

    if(i >= 10) 
    { 
     NSLog(@"Finished"); 
     return; 
    } 

    NSLog(@"sending message %d ...", i); 

    NSMutableDictionary *params = [@{@"param1":  @"value1", 
            @"param2":  @"value2", 
            } mutableCopy]; 
    NSString *webServiceUrl = @"MY_REST_SERVICE_URL"; 

    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init]; 
    manager.responseSerializer = [AFJSONResponseSerializer serializer]; 


    [manager POST:webServiceUrl parameters:params success:^(NSURLSessionDataTask *task, id responseObject) { 
     NSLog(@"message sent successful %d", i); 

     // Now call the method again 
     [self sentTest:i++]; 

     return; 
     } failure:^(NSURLSessionDataTask *task, NSError *error) { 
      NSLog(@"message sent failure %d", i); 
      return; 
    }]; 

} 

ich diesen Fehler:

Variable is not assignable (missing __block type specifier) error" 

Ich weiß, dass ich Blocktyp definieren müssen, aber ich weiß nicht, wie es zu benutzen in dieser rekursiven Funktion.

+1

OK können wir mit 'Manager' beginnen. Das wird zerstört, wenn die Methode endet, ja? Wie wird es dann überhaupt etwas schaffen? – trojanfoe

+0

@trojanfoe Es gibt kein Problem in der zerstörten Manager, ich möchte nur diese Methode erneut aufrufen, so dass ich neue Anfrage direkt nach der letzten Anfrage starten konnte. Ja, es ist nicht die beste Lösung, aber es könnte das Problem lösen. Ich versuche auch andere Lösungen, aber sie funktionieren überhaupt nicht: http://stackoverflow.com/questions/37297033/queue-of-afnetworking-requests-with-dispatch-group-t –

Antwort

1

Ich hatte einige Bedenken, dass manager wurde zerstört, wenn die Methode endet, aber es wird von dem Block beibehalten.

Ich bin nicht sicher, dass Ihr Code funktioniert, aber die tatsächliche Fehlermeldung bezieht sich i im Block zu aktualisieren (und es würde die __block Attribut angewendet haben müssen), aber es gibt keinen Grund i gar zu erhöhen, einfach Pass in i + 1 auf die rekursiv Methode:

[self sentTest:i + 1]; 

(Sie in Ihrem Code ein fehlendes Semikolon hatte, also bin ich nicht davon überzeugt, dass ist der eigentliche Code oder nicht).

+0

es ist ein echter Code, den ich benutze Ihr vorheriger Kommentar, um es zu lösen, mit '__block int count = i' vor dem Block und' [self sentTest: ++ count] 'innerhalb des Blocks, danke trotzdem @trojanfoe –

+0

@SoheilNovinfard: Nein. Es macht keinen Sinn für Sie ändern 'i', weil niemand das' i' noch einmal lesen kann. – newacct