在 iOS 上停止 NSThread
Posted
技术标签:
【中文标题】在 iOS 上停止 NSThread【英文标题】:Stop NSThread on iOS 【发布时间】:2013-07-03 03:03:11 【问题描述】:我有函数调用循环,但我想在我的视图出现时调用它,而不是在视图消失时调用它。
循环功能:
-(void)updateArray
while (1)
NSLog(@"IN LOOP");
[NSThread sleepForTimeInterval:2.0];
if([FileSizeArray count] >0 || [FileCurrentSizeArray count] >0)
[FileSizeArray removeObjectsInRange:NSMakeRange(1, FileSizeArray.count-1)];
[FileCurrentSizeArray removeObjectsInRange:NSMakeRange(1, FileSizeArray.count-1)];
[FileNameArray removeAllObjects];
[UserNameArray removeAllObjects];
...
在ViewWillAppear()
timer= [NSTimer scheduledTimerWithTimeInterval: 2.0
target: self
selector:@selector(updateArray:)
userInfo: nil repeats:NO];
在DidDisAppear()
[timer invalidate];
timer = nil;
但它不起作用,它仍然调用并且我的应用程序崩溃了。
谁能帮帮我?提前致谢
【问题讨论】:
您能否添加应用程序崩溃时收到的错误消息以及它在哪一行崩溃?另外scheduledTimerWithTimeInterval...
会在当前线程上安排计时器(这是主线程,因为它是从viewWillAppear
调用的),您不应该在主线程上调用[NSThread sleep...]
。
因为你的方法没有任何参数,虽然你正在传递它,只需将计时器中的方法名称更改为 (updateArray) 就可以了。
【参考方案1】:
在我看来,您真正想做的是在FileSizeArray
和FileCurrentSizeArray
更改时使用Key-Value Observing 接收回调。
在ViewDidAppear
:
[self addObserver:self forKeyPath:@"FileSizeArray.count" options: 0 context: nil];
[self addObserver:self forKeyPath:@"FileCurrentSizeArray.count" options: 0 context: nil];
回调:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
if ([keyPath isEqualToString:@"FileSizeArray.count"])
//do something
else if ([keyPath isEqualToString:@"FileCurrentSizeArray.count"])
//do something
记得注销:
[self removeObserver:self forKeyPath:@"FileSizeArray"];
[self removeObserver:self forKeyPath:@"FileCurrentSizeArray"];
【讨论】:
谢谢,但它不起作用,我想在视图消失时停止 NSThread。 我相当肯定count
不是 KVO 兼容的属性。【参考方案2】:
[NSThread exit];
或 [NSThread performSelector:@selector(exit) onThread:thread withObject:nil waitUntilDone:YES];
【讨论】:
以上是关于在 iOS 上停止 NSThread的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 上配置 Firebase 应用后,Branch.io 深层链接停止工作
当用户在 iOS 5 上锁定屏幕时 applicationMusicPlayer 停止