- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 UIViewController
viewDidAppear
事件中,我想从网络服务中获取一些数据。代码如下:
- (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] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
时,请求成功 block 不会执行,UI变为无响应。
但如果我像这样更改 - (void)viewDidAppear:(BOOL)animated
,一切顺利。
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self performSelector:@selector(getCarList) withObject:self afterDelay:1];
}
最佳答案
不要做那种语法
NetService
请求异步工作,传递请求结果在 block 中。您必须处理 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
});
}];
}
}
}
编辑:或者使用类似委托(delegate)的模式来处理异步行为。
代替同步方法
- (void)methodToGetCarList
{
NSArray *cars = [self getCarList];
[self doSomethingWithCars:cars];
}
使用这个
- (void)methodToGetCarListAsynchronously
{
[self getCarList];
}
和委托(delegate)方法
- (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];
}
}
如果响应在后台线程中返回,代码不会考虑潜在问题。
关于ios - "[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]"使UI无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32520649/
我对 NSRunLoop 的 runMode:beforeDate 方法的正确使用有疑问。 我有一个辅助的后台线程,用于处理收到的委托(delegate)消息。 基本上,我有需要在后台线程上执行的进程
正如标题所说,NSRunLoop 的 runMode:beforeDate: 不等待。我应该怎么做才能让线程等待 NSRunLoop。 我正在后台线程上运行一个方法: [self performSel
崩溃发生在以下代码中: void CocoaCommRequest::launchSync() { launchAsync(); while (![_delegate finished
我最近发现,在等待我的 NSURLConnections 通过时,如果我告诉等待的线程去做,它会工作得更好: [[NSRunLoop currentRunLoop] runMode:NSDefault
我的应用程序与 iOS5 b7 和 GM 版本的兼容性有问题。 问题出现在下一行代码中: do { [[NSRunLoop currentRunLoop] runMode:NSDefaultR
我正在尝试通过单元测试对我的应用进行一些压力测试,但遇到了一些问题。下面是我的代码: //Stress test api and core data __block BOOL done = N
在 UIViewController viewDidAppear 事件中,我想从网络服务中获取一些数据。代码如下: - (void)viewDidAppear:(BOOL)animated { [s
我有一些关于 NSRunLoop 的问题。当运行如下代码时,主线程似乎停止了,它不会在 while 循环之后运行代码。我想知道什么时候[[NSRunLoop currentRunLoop] runMo
我是一名优秀的程序员,十分优秀!