我对这两个的使用有点困惑。
我有一个后台线程,它负责下载数据并将其应用到 iOS 设备中的核心数据数据库。
后台线程中的代码调用共享实例类 ProgressController 来更新 UI 上的进度(我知道它在主线程中运行)。ProgressController 然后有一个委托,由顶部的视图控制器分配。
一切正常,除了后台线程启动后 UI 不会更新。我知道委托被调用是因为我让 NSLogs 触发了正在传递的文本。
现在我读到我应该使用 performSelectorOnMainThread,但鉴于委托正在触发,这似乎是多余的。
我是否应该使用 performSelectorOnMainThread 而根本不使用委托。
我错过了什么吗?
如果有人能解释一下,我将不胜感激。
谢谢,
克里斯。
在后台线程内
progressController = [ProgressController sharedInstance];
[progressController open];
……
[progressController updateProgress:NSLocalizedString(@"Update text here", @"Update text here")];
在 ProgressController.h 中
#import <Foundation/Foundation.h>
@protocol ProgressControllerDelegate
@required
- (void) displayProgress:(NSString *)text;
- (void) showProgress;
- (void) hideProgress;
@end
@interface ProgressController : NSObject {
NSString *currentProgress;
BOOL progressOnDisplay;
id delegate;
}
+ (ProgressController *)sharedInstance;
@property (nonatomic) BOOL progressOnDisplay;
@property (nonatomic, assign) id delegate;
-(void) open;
-(void) updateProgress:(NSString *)text;
-(void) reDisplayProgress;
-(void) close;
@end
在 ProgressController.m #import "ProgressController.h" 中
@implementation ProgressController
@synthesize progressOnDisplay;
@synthesize delegate;
static ProgressController *sharedInstance;
+ (ProgressController *)sharedInstance {
@synchronized(self) {
if (!sharedInstance)
[[ProgressController alloc] init];
}
return sharedInstance;
}
+(id)alloc {
@synchronized(self) {
NSAssert(sharedInstance == nil, NSLocalizedString(@"Attempted to allocate a second instance of a singleton ProgressController.", @"Attempted to allocate a second instance of a singleton ProgressController."));
sharedInstance = [super alloc];
}
return sharedInstance;
}
-(id) init {
if (self = [super init]) {
[self open];
}
return self;
}
// Ask delegate to show new Progress Label
-(void) open {
progressOnDisplay = TRUE;
currentProgress = @"";
[self.delegate showProgress];
}
// Ask delegate to update and display Progress text
-(void) updateProgress:(NSString *)text {
currentProgress = text;
[self.delegate displayProgress:currentProgress];
}
// Ask delegate display existing Progress text if any
-(void) reDisplayProgress {
if (currentProgress != @"") {
[self.delegate displayProgress:currentProgress];
[self.delegate showProgress];
}
}
// Ask delegate to clear and hide Progress Label
-(void) close {
progressOnDisplay = FALSE;
currentProgress = @"";
[self.delegate hideProgress];
}
@end
在视图控制器内
- (void)viewDidLoad {
[super viewDidLoad];
progressController = [ProgressController sharedInstance];
progressController.delegate = self;
[progressController reDisplayProgress]; // In case progress has been updated prior to the view load
}
// Delegate method to show Progress Label
- (void) showProgress {
progressView.hidden = FALSE;
}
// Delegate method to display specific text in Progress label
- (void) displayProgress:(NSString *)text {
[progressLabel setText:text];
[progressView setNeedsDisplay];
DLog(@"Reporting - %s", [text UTF8String]); // I can see that this is firing successfully
}
// Delegate method to hide Progress Label
- (void) hideProgress {
progressView.hidden = TRUE;
}