UIView медленно удаляется из superview - PullRequest
3 голосов
/ 03 февраля 2011

Я добавляю UIView к окну, пока происходят некоторые многопоточные фоновые обновления, затем использую метод делегата для удаления представления.Все происходит, как задумано, но представление остается в течение нескольких секунд после вызова hideActivityViewer.Не уверен, если это имеет значение, но приложение использует UITabBarController.

Методы обновления были в отдельном классе, но в настоящее время находятся в AppDelegate.m для целей отладки.Как я уже сказал, все работает.Когда обновления завершены, он записывает «Foo» в журнал, но представление сохраняется в течение нескольких секунд.Любая помощь будет оценена.Лишний код был опущен:

AppDelegate.h

@interface AppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> {
  UIWindow *window;
  UITabBarController *tabBarController;
  UIView *activityView;
  id _delegate;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) UITabBarController *tabBarController;
- (void)showActivityViewer;
- (void)updateComplete;
- (void)updateRemoteDataThreadedWithDelegate:(id)aDelegate;
- (id)delegate;
- (void)setDelegate:(id)new_delegate;
@end

AppDelegate.m

- (void)updateRemoteDataThreadedWithDelegate:(id)aDelegate {
  [self setDelegate:aDelegate];
  NSOperationQueue *queue = [NSOperationQueue new];
  NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(updateRemoteDataWithDelegate:) object:aDelegate];
  [queue addOperation:operation];
  [operation release];
}

- (void)updateRemoteDataWithDelegate:(id)aDelegate {
  [self setDelegate:aDelegate];
  ...do stuff...
  if ([_delegate respondsToSelector:@selector(updateComplete)]) {
    [_delegate updateComplete];
  } else { 
    [NSException raise:NSInternalInconsistencyException format:@"Delegate doesn't respond to updateComplete"];
  }
}

-(void)showActivityViewer {
  [activityView release];
  activityView = [[UIView alloc] initWithFrame: CGRectMake(window.bounds.size.width-50, 60, 50, 50)];
  ...formatting...
  [window addSubview: activityView];
  [activityView release];
}
-(void)hideActivityViewer {
  [activityView removeFromSuperview];
  activityView = nil;
  NSLog(@"Foo");
}

- (id)delegate {
  return _delegate;
}

- (void)setDelegate:(id)new_delegate {
  _delegate = new_delegate;
}

Ответы [ 2 ]

3 голосов
/ 03 февраля 2011

Операции пользовательского интерфейса должны выполняться в основном потоке; ваш пример помещает UIView в отдельный поток, что не рекомендуется.

3 голосов
/ 03 февраля 2011

Мне кажется, что вы заставляете поток вызывать метод делегата, который делает вещи в UIView - вы не можете этого сделать, так как UIView не является потокобезопасным.

Используйте executeSelectorOnMainThread, чтобы сделать это безопасно - ваш метод делегата может вызвать другой метод в главном потоке таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...