在下一次运行应用程序之前完成请求操作

时间:2013-03-31 20:27:26

标签: iphone ios objective-c

我从我的数据库中获取一些数据并将其保存到我创建的对象中(称为“ManejadorMateria”)。然后,我希望能够在下一个视图控制器的表视图中显示此数据;问题是需要在前一个视图控制器的prepareforsegue方法上进行请求操作,并且在我需要的数据保存在对象ManejadorMateria之前调用表视图的方法cellForRowAtIndexPath。

在触发方法cellForRowAtIndexPath之前,我该怎么做才能获取数据?

要向数据库发出请求,我正在使用此代码:

-(void)commandWithParams:(NSMutableDictionary*)params onCompletion     (JSONResponseBlock)completionBlock
{
NSMutableURLRequest *apiRequest =
[self multipartFormRequestWithMethod:@"POST"
                                path:kAPIPath
                          parameters:params
           constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {

           }];

AFJSONRequestOperation* operation = [[AFJSONRequestOperation alloc] initWithRequest:   apiRequest];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    //success!
    completionBlock(responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    //failure :(
    completionBlock([NSDictionary dictionaryWithObject:[error localizedDescription]   forKey:@"error"]);
}];

[operation start];
}

要获取我需要的数据,我使用此代码:

- (void)cargarMateriasDeCarrera:(NSString *)carrera{

Materias = [[NSMutableArray alloc] init];
Manejador = [[ManejadorMateria alloc] init];

NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                               @"getMaterias", @"command",
                               carrera, @"carrera",
                               nil];


[[API sharedInstance] commandWithParams:params
                           onCompletion:^(NSDictionary *json) {
                               //handle the response
                               NSDictionary* res = [json objectForKey:@"result"];
                               Materia *materiafuente = [[Materia alloc]init];

                               for (id r in res) {
                                   materiafuente.Nombre = [NSString      stringWithFormat:@"%@",[r objectForKey:@"nombre"]];
                                   materiafuente.Codigo = [NSString stringWithFormat:@"%@",[r objectForKey:@"codigo"]];
                                   materiafuente.Descripcion = [NSString stringWithFormat:@"%@",[r objectForKey:@"descripcion"]];
                                   materiafuente.GradoDificultad = [r objectForKey:@"grado"];
                                   [Materias addObject:materiafuente];

                               }
                               [Manejador setMasterMateriasTodas:Materias];

                                }];


}

最后在我所拥有的相同视图控制器上的准备工作中:

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

usuario.Carrera = [carreras objectAtIndex:self.tableView.indexPathForSelectedRow.row];
TablaMateriasViewController3 *tbvc3 = [segue destinationViewController];
tbvc3.usuario = usuario;


NSString *command = @"registraCarrera";
NSMutableDictionary *params =[NSMutableDictionary dictionaryWithObjectsAndKeys:
                              command, @"command",
                              usuario.Carnet, @"carnet",
                              usuario.Carrera, @"carrera",
                              nil];

[[API sharedInstance] commandWithParams:params
                           onCompletion:^(NSDictionary *json) {
                           }];
[self cargarMateriasDeCarrera:usuario.Carrera];
tbvc3.Manejador = Manejador;
}

1 个答案:

答案 0 :(得分:1)

  

在触发方法cellForRowAtIndexPath之前,我该怎么做才能获取数据。

iOS是事件驱动的。你不能依赖事物的顺序。您不知道何时会调用cellForRowAtIndexPath。因此,当调用cellForRowAtIndexPath时,您拥有数据或不拥有数据。如果你不这样做,那么你提供一个填充物,或者什么都没有。如果您这样做,那么您提供数据。

如果您知道自己拥有数据,并希望再次再次调用,那么请调用cellForRowAtIndexPath或其中一种相关的reloadData方法(例如reload...)。例如,当您获得一行数据时,可以在完成方法中调用它。

在我的书中,我给出了一个示例,其中必须下载单元格的每一行的图像。起初,每个图像都缺失。但是当表格视图请求reloadRowsAtIndexPaths:withRowAnimation:并且图像丢失时,我们开始下载该图像。当它到达时,我们刷新该行,因此再次调用cellForRowAtIndexPath,现在我们拥有图像,因此我们提供图像并显示在表中:

http://www.apeth.com/iOSBook/ch37.html#_http_requests

完整的可下载示例项目:

https://github.com/mattneub/Programming-iOS-Book-Examples/tree/master/ch37p920downloader/p754p772downloader

您可以采用相同的策略。