如何在iOS中从服务器异步获取数据,并在收到数据后更新UI?
在我的iOS应用程序中,我试图从服务器获取数据。我希望以异步方式执行此操作。我正在尝试:如何在iOS中从服务器异步获取数据,并在收到数据后更新UI?,ios,objective-c,asynchronous,grand-central-dispatch,Ios,Objective C,Asynchronous,Grand Central Dispatch,在我的iOS应用程序中,我试图从服务器获取数据。我希望以异步方式执行此操作。我正在尝试: - (void)loadData { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ /** code for fetching data. **/ dispatch_async(dispatch_get_main_queue(), ^{ myList = [NSMutab
- (void)loadData {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
/** code for fetching data. **/
dispatch_async(dispatch_get_main_queue(), ^{
myList = [NSMutableArray arrayWithObjects:fetchedData, nil];
});
});
}
上述方法loadData()是从tableViewController的init()方法调用的
我正在使用此列表中对象的数据显示为单元格。
但是在我从服务器接收数据之前,主线程尝试从列表中填充UI(列表显然是空的)。我如何同步这些
我发现:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
上面的函数(返回myList的计数)返回0,因此我的表显示为空。在我从服务器接收数据之前调用此函数(因为这需要更多的时间,而此方法会立即在主线程中传输控制) 我建议您检查
AFNetworking
()。在AFHTTPRequestOperationManager
的完成处理程序中,只需设置表视图
数据源
和委托
和重新加载数据()。另一种方法是在tableView数据源
setter方法中重新加载数据
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSString *stringURL = //ur url;
[manager GET:stringURL parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (completion) {
//ur completion
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (completion) {
NSLog(@"error: %@", [error localizedDescription]);
}
}];
从服务器获取数据后,只需再次“重新加载”表。然后
再次调用方法(numberOfRows、numberOfSections…)
调用此方法以重新加载用于构造表的所有数据,包括单元格、节页眉和页脚、索引数组等。为了提高效率,表视图只重新显示那些可见的行。如果表格因重新加载而收缩,则会调整偏移。当表视图希望表视图完全重新加载其数据时,表视图的委托或数据源调用此方法。不应在插入或删除行的方法中调用它,尤其是在通过调用BeginUpdate和EndUpdate实现的动画块中
检查
-(无效)加载数据{
调度异步(调度获取全局队列(调度队列优先级默认为0)^{
/**获取数据的代码**/
dispatch\u async(dispatch\u get\u main\u queue()^{
myList=[NSMutableArray arrayWithObjects:fetchedData,nil];
yourTable.reloadData()//您可能希望在调用您的提取函数后尝试调用loadData函数。在您的场景中,在提取函数之前会先调用loadData,这就是为什么您总是得到一个空myList。在调用loadData之前先调用提取函数
如果要使用async,也可以将fetch函数放在async中,但要放一个断点,这样它就不会一直调用它。请告诉我您的问题已经解决了,我没有理解您的意思。在fetch函数之前我没有调用loadData()。我在loadData()中调用fetch函数.请通读整个问题,我相信它会很清楚。正是我需要的!谢谢!
- (void)loadData {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
/** code for fetching data. **/
dispatch_async(dispatch_get_main_queue(), ^{
myList = [NSMutableArray arrayWithObjects:fetchedData, nil];
yourTable.reloadData() // <-- reload your table after update myList
});
});
}
- (void)loadData {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
/** code for fetching data. **/
dispatch_async(dispatch_get_main_queue(), ^{
myList = [NSMutableArray arrayWithObjects:fetchedData, nil];
[yourTable reloadData]; // reload the data
});
});
}