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方法在单例类中。我想用一个单身汉来保存卡片列表。如果卡片列表不为零,请直接返回,否则请从服务器请求并返回@瓦迪安人