Ios 如何在Objective-C中异步获取API数据?
我所有的工作都进行得很顺利,但有点小问题。我的NSURLRequest位于-(void)viewDidLoad{}中,从服务器获取数据花费了一些时间。我希望它以异步方式完成 以下是我的代码,请建议我应该实现什么。? 提前感谢各位。:) 试试这个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
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中执行吗。?