Ios 如何在Objective-C中异步获取API数据?

Ios 如何在Objective-C中异步获取API数据?,ios,objective-c,iphone,xcode,Ios,Objective C,Iphone,Xcode,我所有的工作都进行得很顺利,但有点小问题。我的NSURLRequest位于-(void)viewDidLoad{}中,从服务器获取数据花费了一些时间。我希望它以异步方式完成 以下是我的代码,请建议我应该实现什么。? 提前感谢各位。:) 试试这个 dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ //Background Thread N

我所有的工作都进行得很顺利,但有点小问题。我的NSURLRequest位于-(void)viewDidLoad{}中,从服务器获取数据花费了一些时间。我希望它以异步方式完成

以下是我的代码,请建议我应该实现什么。? 提前感谢各位。:)

试试这个

  dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
        //Background Thread

       NSString *castString = [NSString stringWithFormat:@"https://api.themoviedb.org/3/movie/%@/credits?api_key=c4bd81709e87b12e6c74a08609433c49",movieIDinString];
        NSURL *url=[NSURL URLWithString:castString];

        NSURLRequest *request=[NSURLRequest requestWithURL:url];
        connection=[NSURLConnection connectionWithRequest:request delegate:self];
        if (connection)
        {
            webData=  [[NSMutableData alloc]init];
        }

        dispatch_async(dispatch_get_main_queue(), ^(void){
            //Run UI Updates

// reload table view here
            [_activityIndicatorImageView stopAnimating];
        });
    });
试试这个

  dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
        //Background Thread

       NSString *castString = [NSString stringWithFormat:@"https://api.themoviedb.org/3/movie/%@/credits?api_key=c4bd81709e87b12e6c74a08609433c49",movieIDinString];
        NSURL *url=[NSURL URLWithString:castString];

        NSURLRequest *request=[NSURLRequest requestWithURL:url];
        connection=[NSURLConnection connectionWithRequest:request delegate:self];
        if (connection)
        {
            webData=  [[NSMutableData alloc]init];
        }

        dispatch_async(dispatch_get_main_queue(), ^(void){
            //Run UI Updates

// reload table view here
            [_activityIndicatorImageView stopAnimating];
        });
    });

若您使用的是API,那个么从服务器获取数据将需要一些时间。此时,您必须使用后台线程并在主线程中显示活动指示器。从API获取数据后,您需要将线程更改为主线程。请检查我下面的代码

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
    // background thread
    // code for API call

    dispatch_async(dispatch_get_main_queue(), ^{
        // main thread
    });
});
您也可以使用回调方法

[helperApi instaUserDetails:finderDetailsDataDict andCallback:^(id jsonResponse) {
        dispatch_async(dispatch_get_main_queue(), ^{
            if ([[jsonResponse objectForKey:@"code"] intValue] == 200) {

                userDetailsDict = [jsonResponse objectForKey:@"data"];

                mediaArray = [[[[jsonResponse objectForKey:@"data"] objectForKey:@"user"] objectForKey:@"media"] objectForKey:@"nodes"];
            }
            [activityIndicator stopAnimating];
            [self createUI];
        });
    }];

NSURLConnection现在不推荐使用。尝试使用NSURLSession。

如果您使用的是API,则从服务器获取数据将需要一些时间。此时,您必须使用后台线程并在主线程中显示活动指示器。从API获取数据后,您需要将线程更改为主线程。请检查我下面的代码

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
    // background thread
    // code for API call

    dispatch_async(dispatch_get_main_queue(), ^{
        // main thread
    });
});
您也可以使用回调方法

[helperApi instaUserDetails:finderDetailsDataDict andCallback:^(id jsonResponse) {
        dispatch_async(dispatch_get_main_queue(), ^{
            if ([[jsonResponse objectForKey:@"code"] intValue] == 200) {

                userDetailsDict = [jsonResponse objectForKey:@"data"];

                mediaArray = [[[[jsonResponse objectForKey:@"data"] objectForKey:@"user"] objectForKey:@"media"] objectForKey:@"nodes"];
            }
            [activityIndicator stopAnimating];
            [self createUI];
        });
    }];

NSURLConnection现在不推荐使用。尝试使用NSURLSession。

尝试。它为异步下载/上传提供了几个选项,并带有完成块。

试试看。它为异步下载/上载提供了多个选项,并带有完成块。

dispatch\u async(dispatch\u get\u global\u queue(dispatch\u queue\u PRIORITY\u DEFAULT,0),^(void){//后台线程dispatch\u async(dispatch\u get\u main\u queue(),^(void){//运行UI更新[\u activityindicationmageview stop animating];});@SudheerKolasani您能解释一下吗,因为我是目标Cit的新手。很简单,只需在后台加载url,然后在主线程中重新加载tableview是否正常工作?调度异步(调度获取全局队列(调度队列优先级默认为0),^(无效){//Background Thread dispatch_async(dispatch_get_main_queue(),^(void){//Run UI Updates[\u activityindicationmageview stop animating];});});@SudheerKolasani你能解释一下吗?因为我在Objective Cit中是新手。很简单,只需在后台加载url,然后在主线程中重新加载tableview。它工作正常吗?我应该在viewDidLoad中执行吗?我应该在viewDidLoad中执行吗。?