iOS异步处理与界面更新实践
立即解锁
发布时间: 2025-08-21 01:59:22 订阅数: 9 

### iOS开发中的异步处理与线程通信
在iOS开发中,异步处理和线程通信是非常重要的概念。合理地使用异步处理可以避免主线程被阻塞,提高用户界面的响应性;而线程通信则能让我们在后台线程执行任务的同时,实时更新用户界面。下面将详细介绍相关的实现方法。
#### 1. 异步处理基础代码
首先,我们来看一段基础的异步处理代码,它创建了一个按钮和一个活动指示器。
```objc
self.myButton.frame = CGRectMake(20, 403, 280, 37);
[self.myButton addTarget:self
action:@selector(bigTaskAction)
forControlEvents:UIControlEventTouchUpInside];
[self.myButton setTitle:@"Do Long Task"
forState:UIControlStateNormal];
[self.view addSubview:self.myButton];
// Create activity indicator
self.myActivityIndicator = [[UIActivityIndicatorView alloc] init];
self.myActivityIndicator.frame = CGRectMake(142, 211, 37, 37);
self.myActivityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
self.myActivityIndicator.hidesWhenStopped = NO;
[self.view addSubview:self.myActivityIndicator];
```
##### 使用步骤
1. 在Xcode中设置一个基于单视图的应用程序。
2. 将上述代码添加到自己的`ViewController`类中。
3. 运行应用程序,在iOS模拟器中,你会看到一个带有一个按钮和一个白色活动指示器的应用。
4. 点击按钮并查看日志,你会看到`for`循环执行,活动指示器开始旋转。当`bigTask`完成时,活动指示器将停止旋转。
为了对比不使用新线程的情况,你可以注释掉`bigTaskAction`方法,然后取消注释替代的`bigTask`方法。再次运行应用程序,你会发现主线程被锁定,无法使用界面,但`for`循环会继续执行,你可以在日志中看到结果。
#### 2. 主线程与后台线程的通信问题及解决方案
当你尝试从后台线程更新用户界面时,会遇到问题:直到后台线程处理完成,更改才会生效,这使得进度条等组件变得无用。为了解决这个问题,我们可以使用`NSObject`的`performSelectorOnMainThread:withObject:waitUntilDone:`方法在主线程上执行方法。
##### 具体实现步骤
1. **添加`UIProgressView`对象属性**:在`ViewController`类的头文件中添加`UIProgressView`对象属性。
```objc
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property(strong) UIButton *myButton;
@property(strong) UIActivityIndicatorView *myActivityIndicator;
@property(strong) UIProgressView *myProgressView;
@end
```
同时,在`ViewController`实现文件的`@synthesize`语句中添加`myProgressView`。
```objc
#import "ViewController.h"
@implementation ViewController
@synthesize myButton, myActivityIndicator, myProgressView;
@end
```
2. **创建更新进度视图的方法**:创建一个名为`updateProgressViewWithPercentage:`的方法,该方法接受一个`NSNumber`对象作为参数,表示任务完成的百分比。
```objc
-(void)updateProgressViewWithPercentage:(NSNumber *)percentDone{
[self.myProgressView setProgress:[percentDone floatValue]
animated:YES];
}
```
3. **更新`bigTask`方法**:修改`bigTask`方法,使其在达到一定进度时更新进度视图。
```objc
-(void) bigTask{
@autoreleasepool {
int updateUIWhen = 1000;
for(int i=0;i<10000;i++){
NSString *newString = [NSString stringWithFormat:@"i = %i", i];
NSLog(@"%@", newString);
if(i =
```
0
0
复制全文
相关推荐










