0

私は RestKit バージョン 0.20.3 を使用して、他の多くの場所で使用される汎用メソッドを作成しています。問題は、そのメソッドからの戻り値が常に nil であることです。ステートメントは、[objectManager getObjectsAtPath ...] メソッドで Success コールバック関数の前に実行されます (以下のコードを参照)。

「返却場所」が欲しい。ステートメントは、ブロック変数 "location" が [objectManager getObjectsAtPath ...] メソッド内の Success コールバック関数からのデータで満たされるのを待つ必要があります。これどうやってするの?

ご協力ありがとうございました。

私の一般的な方法は次のようになります。

-(KNSunGoogleLatitudeLongitudeGeometryLocation*)getSynchronouslyLatitudeLongitudeWithAddress:(NSString*)address
{
    __block KNSunGoogleLatitudeLongitudeGeometryLocation* location = [[KNSunGoogleLatitudeLongitudeGeometryLocation alloc] init];


    NSURL *baseURL = [NSURL URLWithString:@"http://maps.googleapis.com/maps/api"];
    AFHTTPClient * client = [AFHTTPClient clientWithBaseURL:baseURL];
    [client setDefaultHeader:@"Accept" value:RKMIMETypeJSON];
    RKObjectManager *objectManager = [[RKObjectManager alloc] initWithHTTPClient:client];


    //1. KNSunGoogleLatitudeLongitudeGeometryLocation

    RKObjectMapping *locationMapping = [RKObjectMapping mappingForClass:[KNSunGoogleLatitudeLongitudeGeometryLocation class]];
    [locationMapping addAttributeMappingsFromArray:@[@"lat", @"lng"]];


    //2. KNSunGoogleLatitudeLongitudeGeometry

    RKObjectMapping *geometryMapping = [RKObjectMapping mappingForClass:[KNSunGoogleLatitudeLongitudeGeometry class]];

    //3. KNSunGoogleLatitudeLongitude

    RKObjectMapping *latLongMapping = [RKObjectMapping mappingForClass:[KNSunGoogleLatitudeLongitude class]];



    //4. property/relationship mapping

    [geometryMapping addPropertyMapping:[RKRelationshipMapping
                                         relationshipMappingFromKeyPath:@"location"
                                         toKeyPath:@"location"
                                         withMapping:locationMapping]];

    [latLongMapping addPropertyMapping:[RKRelationshipMapping
                                        relationshipMappingFromKeyPath:@"geometry"
                                        toKeyPath:@"geometry"
                                        withMapping:geometryMapping]];



    // 6. response
    RKResponseDescriptor * responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:latLongMapping
                                                                                             method:RKRequestMethodGET
                                                                                        pathPattern:nil
                                                                                            keyPath:@"results"
                                                                                        statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
    // 7
    [objectManager addResponseDescriptor:responseDescriptor];



    NSDictionary *queryParams;
    queryParams = [NSDictionary dictionaryWithObjectsAndKeys:address, @"address", @"false", @"sensor", nil];


    // 6

    [objectManager getObjectsAtPath:@"http://maps.googleapis.com/maps/api/geocode/json"
                         parameters:queryParams
                            success:^(RKObjectRequestOperation * operaton, RKMappingResult *mappingResult)
     {

             //-----------
             NSArray* results = [mappingResult array];
             KNSunGoogleLatitudeLongitude* result0 = [results objectAtIndex:0];
             KNSunGoogleLatitudeLongitudeGeometry* geometry = result0.geometry;

             location= geometry.location;

             NSLog(@"lat=%@, long=%@", location.lat, location.lng);


     }
                            failure:^(RKObjectRequestOperation * operaton, NSError * error)
     {
         NSLog (@"failure: operation: %@ \n\nerror: %@", operaton, error);
     }];


    return location;  // note: ALWAYS RETURNs nil 
}
4

1 に答える 1