には、どうするのがベストな対応UIActivityIndicator、複数のスレッド?
-
27-09-2019 - |
質問
そこで広く用いられている遊び周辺のこの長時間やまだひさしをはじめとするものです。を取得しています混乱しないようであるとする回答方法についての意見はそう簡単に行えます。
こういうことができるようにして再利用可能なクラスと呼ばれActivityIndicatorController.このコントローラには、二つの柱があります。方法activateIndicatorとdeactivateIndicator.でUIViewの引数として-財産などのNSStringのためのラベル。に起動でoffにしてユーザー相互作用のUIViewの追加矩形subview(アルファ未満を切り捨てて記載して角)UIActivityIndicator制御UILabelの状況です。このことが望ましいことだと思っていないカスタムUIActivityIndicatorViewコードの各ビューコントローラにて設ActivityIndicator各ペン先です。
問題は私の根本とはどのようにキックオフプロセスの追加および使用してアニメーション化のActivityIndicator.あかたい表示は新しいビューです。その他のActivityIndicatorなアニメーション.
私にしてみました[NSThread detachNewThreadSelector:@selector(startAnimating)toTarget:activityIndicator withObject:nil]内のactivateIndicator方法で表示しませんの新しいUIView.
私にしてみました[NSThread detachNewThreadSelector:@selector(activateIndicator)toTarget:activityIndicatorController withObject:nil]からメソッドを呼び出しがこのクを新しいUIView別のスレです。
現在の質問:
第1部:理解しているすべてのUIの取り扱いにあたってのスレッドは正しいのですか。
第2部何か違いはある/advantage/不利用[NSThread detachThreadSelector]対NSOperation?
第3部:より:
(a)をお送り長時間の操作で新しい背景レコールバックのメインスレッドまたは
(b)で送のUIActivityIndicatorView startAnimating方法を個別のスレッドでの長いプロセスのメインスレッド
るのか。
ここには現在の私のコード:
ActivityViewControllerクラス:
-(void)activateIndicator {
NSLog(@"activateIndicator called");
if (isActivated || !delegateView)
return;
NSLog(@"activateIndicator started");
[delegateView.view setUserInteractionEnabled:NO];
[delegateView.navigationController.view setUserInteractionEnabled:NO];
[delegateView.tabBarController.view setUserInteractionEnabled:NO];
float w = [[UIScreen mainScreen] bounds].size.width;
float h = [[UIScreen mainScreen] bounds].size.height;
NSLog(@"Width = %f\nHeight = %f", w, h);
if (!disabledView) {
disabledView = [[[UIView alloc] initWithFrame:CGRectMake((w - kNormalWidth) / 2.0, (h - kNormalHeight) / 2.0, kNormalWidth, kNormalHeight)] autorelease];
disabledView.center = [[[delegateView.view superview] superview] center];
[disabledView setBackgroundColor:[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.85]];
CALayer *layer = [disabledView layer];
NSLog(@"layer=%@",layer);
NSLog(@"delegate=%@",[layer delegate]);
layer.cornerRadius = 12.0f;
}
if (!activityIndicator) {
activityIndicator = [[[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(kNormalWidth / 2, 10.0f, 40.0f, 40.0f)] autorelease];
[activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhiteLarge];
activityIndicator.center = disabledView.center;
}
if (!activityLabel) {
activityLabel = [[[UILabel alloc] initWithFrame:CGRectMake(10.0f, 100.0f, kNormalWidth - 20, 38)] autorelease];
activityLabel.text = labelText;
activityLabel.textAlignment = UITextAlignmentCenter;
activityLabel.backgroundColor = [UIColor colorWithWhite:0.0f alpha:0.0f];
activityLabel.textColor = [UIColor colorWithWhite:1.0f alpha:1.0f];
activityLabel.center = disabledView.center;
}
[[[delegateView.view superview] superview] addSubview:disabledView];
[[[delegateView.view superview] superview] addSubview:activityIndicator];
[[[delegateView.view superview] superview] addSubview:activityLabel];
[NSThread detachNewThreadSelector:@selector(startAnimating) toTarget:activityIndicator withObject:nil];
}
呼び出しコードからは複数のアプリ
ActivityIndicatorController *aic = [[ActivityIndicatorController alloc] init];
aic.delegateView = self;
aic.labelText = @"Test...";
[aic activateIndicator];
//DO LENGTHY WORK ON MAIN THREAD
[aic deactivateIndicator];
[aic release], aic = nil;
解決
第1部:理解しているすべてのUIの取り扱いにあたってのスレッドは正しいのですか。
正しい。
第2部何か違いはある/advantage/不利用[NSThread detachThreadSelector]対NSOperation?
NSOperation
高レベルのインタフェースできるキュー事業を複数の業務に依存している、など。その他のオプションを仕事と作業の背景 performSelectorOnMainThread:...
/performSelectorInBackground:...
グランド中央派遣すること。
第3部:より:
(a)をお送り長時間の操作で新しい背景レコールバックのメインスレッドまたは
(b)で送のUIActivityIndicatorView startAnimating方法を個別のスレッドでの長いプロセスのメインスレッド
この質問の回答1(a)のみになりますのオプションです。
他のヒント
お入れ長時間の作業は別のスレッド、そのような完全にブロックのUIの場合はうまく管理できなければならない一部の相互作用(言を取り消す。そして、自分のActivityIndicatorControllerを呼び出のメインスレッドにUIもの、例えば:
@implementation ActivityIndicatorController
- (void)activateIndicator
{
[self performSelectorOnMainThread:@selector(activateOnMainThread)
withObject:nil
waitUntilDone:YES];
}
- (void)activateOnMainThread
{
// Do your actual UI stuff here.
}
// And similarly for the deactivate method.
一度に表示されアニメーションの活動の指標を継続を使用してアニメーション化のメインスレッドがブロックされて
しかし、ビューにはなかなか機会のないくためのループが実行中で長時間動作します。
と思うのに必要なものは performSelector:withObject:afterDelay
遅延時間0分)は、長時間動作するキューを行った後は、指標となります。