目标C - 阻止代码不按顺序执行?

时间:2012-10-01 17:16:04

标签: objective-c ios uitableview client-server afnetworking

我正在尝试将数据加载到应用程序中,因为单元格进入视图,这样一旦按下单元格的附件按钮,它就会加载数据。

我的问题是我正在使用AFNetworking而我正在使用此块代码:

[Request fullRequestWithBlock:^(NSArray *detailedReqFromWeb, NSError *error) {
        if (error) {

            [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", nil) message:[error localizedDescription] delegate:nil cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"OK", nil), nil] show];
        } else {

            NSArray *objs = [NSArray arrayWithObjects: [detailedReqFromWeb objectAtIndex: 0], [detailedReqFromWeb objectAtIndex: 1], [detailedReqFromWeb objectAtIndex: 2], [detailedReqFromWeb objectAtIndex: 3], [detailedReqFromWeb objectAtIndex: 4], [detailedReqFromWeb objectAtIndex: 5], nil];
            NSArray *keys = [NSArray arrayWithObjects:@"Risk", @"Destination", @"Source", @"Customer", @"Subcategory", @"Deployment", nil];

            NSMutableDictionary *detailsforRequestDictionary = [[NSMutableDictionary alloc] initWithObjects:objs forKeys:keys];

            [request addEntriesFromDictionary: detailsforRequestDictionary];

            NSLog(@"%@ Finished Loading", [idNumbers objectAtIndex:row]);
            cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;

        }

    } forID: [[idNumbers objectAtIndex:row] substringFromIndex:1]];

所以基本上,我试图在数据加载后将附件类型从指示器更改为公开按钮,然后我可以执行segue到另一个视图,其中将显示我加载的数据。

我的问题是它在完成加载之前将cell.accessoryType更改为按钮。调试NSLog实际上在实际完成加载时输出。

仅在按钮完成加载后启用按钮的最佳方法是什么?我猜这个请求没有被主线程处理。为什么我会收到请求已完成处理的通知,以便我可以切换accessoryTypes?

谢谢!

1 个答案:

答案 0 :(得分:4)

除非您不回收单元格,否则不应该保留单元格引用,因为它表示的数据会随着用户滚动而更改。正确的方法是在主队列上调度一个块,用于更新节/行坐标中的表条目。然后,您的代码会检查该单元格是否可见,然后更新它。它还会以其他方式记录状态,以便在表格滚动时应用正确的状态。