2013-03-31 60 views
0

我从数据库中获取一些数据并将其保存到我创建的对象(称为“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]; 

           }]; 


} 
在prepareforsegue

最后同样的视图控制器上,我有:

-(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

什么我可以在触发方法cellForRowAtIndexPath之前获取数据。

iOS是事件驱动的。你不能依赖事物的顺序。你不知道什么时候会调用cellForRowAtIndexPath。所以,当调用cellForRowAtIndexPath时,要么有数据,要么没有。如果你不这样做,那么你提供一种填充物,或者根本没有。如果你这样做,那么你提供的数据。

如果你知道你有数据,你想cellForRowAtIndexPath被称为再次,然后调用reloadData或相关reload...方法(如reloadRowsAtIndexPaths:withRowAnimation:)之一。例如,当你获得一行数据时,你可以在你的完成方法中调用它。

在我的书中,我举了一个例子,其中必须下载单元格的每一行图像。起初,每个图像都缺失。但是当表格视图请求cellForRowAtIndexPath,并且图像丢失时,我们开始下载该图像。当它到来时,我们刷新该行,所以cellForRowAtIndexPath再次打来电话,现在我们有图像,所以我们提供的图像,并将其显示在表:

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

完成下载示例项目:

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

你或许可以适应相同的策略。

+0

我期待着一些线程,而不是回顾这种方法,因为我不知道我正在获取的数据的大小 – Sabaspro

+0

当你异步下载(就像你在做的那样)你*是*使用线程。 – matt

+0

非常感谢马特,但是当操作等待完成时,我怎么能让主线程进入休眠状态 – Sabaspro

相关问题