2012-06-22 3 views
7

Ich muss die Antwort von AFNetworking-Aufrufe innerhalb meiner eigenen Methode kapseln, wie ich eine Bibliothek schreibe. Dieser Code wird mir nahe:Wrapping Erfolg Fehler Blöcke von AFNetworking innerhalb einer Methode

MyDevice *devices = [[MyDevice alloc] init]; 
    [devices getDevices:@"devices.json?user_id=10" success:^(AFHTTPRequestOperation *operation, id responseObject) { 

    ... can process json object here ... 

} 

- (void)getDevices:(NSString *)netPath success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success 
    failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error)) failure { 
    [[MyApiClient sharedDeviceServiceInstance] getPath:[NSString stringWithFormat:@"%@", netPath] 
     parameters:nil success:success failure:failure]; 
} 

Ich brauche aber die json Objektdaten aus getPath zurück verarbeiten, bevor zu getDevices Rückkehr(). Ich habe dies versucht:

- (void)getDevices:(NSString *)netPath success:(void (^)(id myResults))success 
     failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error)) failure { 

    [[MyApiClient sharedDeviceServiceInstance] getPath:[NSString stringWithFormat:@"%@", netPath] 
    parameters:nil 
    success:^(AFHTTPRequestOperation *operation, id responseObject) 
    { 
    ... can process json object here ... 
    }       
    failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    ... process errors here ... 
    }]; 
} 

Aber jetzt gibt es keinen Rückruf getDevices(). Also, wie verarbeite ich das Json-Objekt in getDevices & haben die Blockrückgabe bei Abschluss? Schätzen Sie die Hilfe, wie ich neu in Blöcken bin.

Antwort

10

Das ist wirklich einfach: Rufen Sie den Block einfach auf, indem Sie ihn wie eine Funktion aufrufen.

- (void)getDevices:(NSString *)netPath 
      success:(void (^)(id myResults))success 
      failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error)) failure 
{ 
    [[MyApiClient sharedDeviceServiceInstance] 
    getPath:netPath 
    parameters:nil 
    success:^(AFHTTPRequestOperation *operation, id responseObject) 
    { 
     id myResults = nil; 
     // ... can process json object here ... 
     success(myResults); 
    }       
    failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     // ... process errors here ... 
     failure(operation, error); 
    }]; 
} 

EDIT:

basierend auf dem Code Sie auf dem Laufenden Ich denke, die folgende Schnittstelle klarer sein würde:

typedef void(^tFailureBlock)(NSError *error); 

- (void)getDevicesForUserID:(NSString *)userID 
        success:(void (^)(NSArray* devices))successBlock 
        failure:(tFailureBlock)failureBlock; 
+0

Danke phix23! Durch Hinzufügen von "Erfolg (myResults);" Der Erfolgsbaustein getPath() bewirkt, dass alles wie erwartet funktioniert. Vielen Dank für die super schnelle Antwort. - Dan – Dan

+0

Schätze auch die Klarheit Kommentare. Sie haben sich auf die Funktionalität konzentriert, werden diese Vorschläge jedoch in die endgültige Version integrieren. – Dan

+0

Ich möchte diese getDevices-Funktion in swift.Can Sie konvertieren, um schnell –

Verwandte Themen