私はこれら2つの使用について少し混乱しています。
データをダウンロードして iOS デバイス内の Core Data Database に適用するという面倒な作業を行うバックグラウンド スレッドがあります。
バックグラウンド スレッド内のコードは、共有インスタンス クラス ProgressController を呼び出して、UI の進行状況を更新します (これはメイン スレッドで実行されることがわかっています)。次に、ProgressController には、一番上にある View Controller によって割り当てられるデリゲートがあります。
バックグラウンド スレッドが開始されると 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
View Controller内
- (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;
}