Ios &引用;[[NSRunLoop currentRunLoop]运行模式:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];使UI无响应
在Ios &引用;[[NSRunLoop currentRunLoop]运行模式:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];使UI无响应,ios,nsthread,nsrunloop,viewdidappear,Ios,Nsthread,Nsrunloop,Viewdidappear,在UIViewControllerviewdideappear事件中,我想从web服务获取一些数据。代码如下: - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; NSArray *arr = [self getCarList]; } - (NSArray *)getCarList { if (!carList) { ARequset *req = [[ARequset alloc] ini
UIViewController
viewdideappear
事件中,我想从web服务获取一些数据。代码如下:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSArray *arr = [self getCarList];
}
- (NSArray *)getCarList
{
if (!carList) {
ARequset *req = [[ARequset alloc] init];
[NetService sendRequest:req respClass:[Resp class] success:^(BaseResponse *response)
{
//after finished
self.requestFinished = YES;
} fail:^(NSInteger errcode, NSString *errmsg) {
self.requestFinished = YES;
}];
while (!self.requestFinished) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
}
return carList;
}
当运行到[[NSRunLoop currentRunLoop]运行模式:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]时代码>将不执行请求成功块,UI将变为无响应
但是如果我像这样更改-(void)viewdide:(BOOL)animated
,一切都会顺利
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self performSelector:@selector(getCarList) withObject:self afterDelay:1];
}
不要使用那种语法
NetService
请求异步工作,请求的结果被传递
在街区里。您必须处理BaseResponse
对象,并更新您的UI或您想对数据执行的任何操作
轮询是一种坏习惯,会不必要地消耗系统资源
除此之外,您还告诉当前运行的UIApplication的runloop运行哪个块
做这样的事
- (void)getCarList
{
if (!carList) {
ARequset *req = [[ARequset alloc] init];
[NetService sendRequest:req respClass:[Resp class] success:^(BaseResponse *response)
{
//after finished
self.carList = [self doSomethingWithTheResponse:response];
dispatch_async(dispatch_get_main_queue(), ^(void) {
// Update UI
});
} fail:^(NSInteger errcode, NSString *errmsg) {
dispatch_async(dispatch_get_main_queue(), ^(void) {
// show alert
});
}];
}
}
}
编辑:或者使用类似委托的模式来处理异步行为
而不是同步方法
- (void)methodToGetCarList
{
NSArray *cars = [self getCarList];
[self doSomethingWithCars:cars];
}
用这个
- (void)methodToGetCarListAsynchronously
{
[self getCarList];
}
和委托方法
- (void)didReceiveCars:(NSArray *)cars errorMessage:(NSString *)error
{
if (error) {
// do error handling
} else {
[self doSomethingWithCars:cars];
}
}
getCarList
方法如下所示
- (void)getCarList
{
if (!carList) {
ARequset *req = [[ARequset alloc] init];
[NetService sendRequest:req respClass:[Resp class] success:^(BaseResponse *response)
{
//after finished
self.carList = [self doSomethingWithTheResponse:response];
[self didReceiveCars:self.carList errorMessage:nil];
} fail:^(NSInteger errcode, NSString *errmsg) {
[self didReceiveCars:nil errorMessage:errmsg];
}];
}
} else {
[self didReceiveCars:self.carList errorMessage:nil];
}
}
如果响应在后台线程中返回,则代码不考虑潜在问题。
<强>不要执行那种语法< /强>
NetService
请求异步工作,请求的结果被传递
在街区里。您必须处理BaseResponse
对象,并更新您的UI或您想对数据执行的任何操作
轮询是一种坏习惯,会不必要地消耗系统资源
除此之外,您还告诉当前运行的UIApplication的runloop运行哪个块
做这样的事
- (void)getCarList
{
if (!carList) {
ARequset *req = [[ARequset alloc] init];
[NetService sendRequest:req respClass:[Resp class] success:^(BaseResponse *response)
{
//after finished
self.carList = [self doSomethingWithTheResponse:response];
dispatch_async(dispatch_get_main_queue(), ^(void) {
// Update UI
});
} fail:^(NSInteger errcode, NSString *errmsg) {
dispatch_async(dispatch_get_main_queue(), ^(void) {
// show alert
});
}];
}
}
}
编辑:或者使用类似委托的模式来处理异步行为
而不是同步方法
- (void)methodToGetCarList
{
NSArray *cars = [self getCarList];
[self doSomethingWithCars:cars];
}
用这个
- (void)methodToGetCarListAsynchronously
{
[self getCarList];
}
和委托方法
- (void)didReceiveCars:(NSArray *)cars errorMessage:(NSString *)error
{
if (error) {
// do error handling
} else {
[self doSomethingWithCars:cars];
}
}
getCarList
方法如下所示
- (void)getCarList
{
if (!carList) {
ARequset *req = [[ARequset alloc] init];
[NetService sendRequest:req respClass:[Resp class] success:^(BaseResponse *response)
{
//after finished
self.carList = [self doSomethingWithTheResponse:response];
[self didReceiveCars:self.carList errorMessage:nil];
} fail:^(NSInteger errcode, NSString *errmsg) {
[self didReceiveCars:nil errorMessage:errmsg];
}];
}
} else {
[self didReceiveCars:self.carList errorMessage:nil];
}
}
如果响应在后台线程中返回,则代码不考虑潜在问题。
<强>不要执行那种语法< /强>
NetService
请求异步工作,请求的结果被传递
在街区里。您必须处理BaseResponse
对象,并更新您的UI或您想对数据执行的任何操作
轮询是一种坏习惯,会不必要地消耗系统资源
除此之外,您还告诉当前运行的UIApplication的runloop运行哪个块
做这样的事
- (void)getCarList
{
if (!carList) {
ARequset *req = [[ARequset alloc] init];
[NetService sendRequest:req respClass:[Resp class] success:^(BaseResponse *response)
{
//after finished
self.carList = [self doSomethingWithTheResponse:response];
dispatch_async(dispatch_get_main_queue(), ^(void) {
// Update UI
});
} fail:^(NSInteger errcode, NSString *errmsg) {
dispatch_async(dispatch_get_main_queue(), ^(void) {
// show alert
});
}];
}
}
}
编辑:或者使用类似委托的模式来处理异步行为
而不是同步方法
- (void)methodToGetCarList
{
NSArray *cars = [self getCarList];
[self doSomethingWithCars:cars];
}
用这个
- (void)methodToGetCarListAsynchronously
{
[self getCarList];
}
和委托方法
- (void)didReceiveCars:(NSArray *)cars errorMessage:(NSString *)error
{
if (error) {
// do error handling
} else {
[self doSomethingWithCars:cars];
}
}
getCarList
方法如下所示
- (void)getCarList
{
if (!carList) {
ARequset *req = [[ARequset alloc] init];
[NetService sendRequest:req respClass:[Resp class] success:^(BaseResponse *response)
{
//after finished
self.carList = [self doSomethingWithTheResponse:response];
[self didReceiveCars:self.carList errorMessage:nil];
} fail:^(NSInteger errcode, NSString *errmsg) {
[self didReceiveCars:nil errorMessage:errmsg];
}];
}
} else {
[self didReceiveCars:self.carList errorMessage:nil];
}
}
如果响应在后台线程中返回,则代码不考虑潜在问题。
<强>不要执行那种语法< /强>
NetService
请求异步工作,请求的结果被传递
在街区里。您必须处理BaseResponse
对象,并更新您的UI或您想对数据执行的任何操作
轮询是一种坏习惯,会不必要地消耗系统资源
除此之外,您还告诉当前运行的UIApplication的runloop运行哪个块
做这样的事
- (void)getCarList
{
if (!carList) {
ARequset *req = [[ARequset alloc] init];
[NetService sendRequest:req respClass:[Resp class] success:^(BaseResponse *response)
{
//after finished
self.carList = [self doSomethingWithTheResponse:response];
dispatch_async(dispatch_get_main_queue(), ^(void) {
// Update UI
});
} fail:^(NSInteger errcode, NSString *errmsg) {
dispatch_async(dispatch_get_main_queue(), ^(void) {
// show alert
});
}];
}
}
}
编辑:或者使用类似委托的模式来处理异步行为
而不是同步方法
- (void)methodToGetCarList
{
NSArray *cars = [self getCarList];
[self doSomethingWithCars:cars];
}
用这个
- (void)methodToGetCarListAsynchronously
{
[self getCarList];
}
和委托方法
- (void)didReceiveCars:(NSArray *)cars errorMessage:(NSString *)error
{
if (error) {
// do error handling
} else {
[self doSomethingWithCars:cars];
}
}
getCarList
方法如下所示
- (void)getCarList
{
if (!carList) {
ARequset *req = [[ARequset alloc] init];
[NetService sendRequest:req respClass:[Resp class] success:^(BaseResponse *response)
{
//after finished
self.carList = [self doSomethingWithTheResponse:response];
[self didReceiveCars:self.carList errorMessage:nil];
} fail:^(NSInteger errcode, NSString *errmsg) {
[self didReceiveCars:nil errorMessage:errmsg];
}];
}
} else {
[self didReceiveCars:self.carList errorMessage:nil];
}
}
如果响应在后台线程中返回,代码不会考虑潜在的问题。
但是,方法GETCARLIST处于一个单独的类中。我想用一个单身汉来保存卡片列表。如果卡片列表不为零,请直接返回,否则请从服务器请求并返回@但是,getCarList方法在单例类中。我想用一个单身汉来保存卡片列表。如果卡片列表不为零,请直接返回,否则请从服务器请求并返回@但是,getCarList方法在单例类中。我想用一个单身汉来保存卡片列表。如果卡片列表不为零,请直接返回,否则请从服务器请求并返回@但是,getCarList方法在单例类中。我想用一个单身汉来保存卡片列表。如果卡片列表不为零,请直接返回,否则请从服务器请求并返回@瓦迪安人