Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在iOS中从服务器异步获取数据,并在收到数据后更新UI?_Ios_Objective C_Asynchronous_Grand Central Dispatch - Fatal编程技术网

如何在iOS中从服务器异步获取数据,并在收到数据后更新UI?

如何在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

在我的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 = [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

  });
 });


}