情景就是这样 -
在我的应用程序中有一个滚动视图,其中包含许多
实例MyCustomImageDownloaderController(包含下载后要分配图像的imageViews)。
根据我们的要求,当我们移动到页面时,必须下载图像。
滚动视图+(MyCustomImageDownloaderController1,MyCustomImageDownloaderController2,MyCustomImageDownloaderController3 ....等)
让我说我正在滚动它,
我到达第1页 - >它的图像应该开始下载
我到达第2页 - >它的图像应该开始下载......等等
如果我在第3页,如果没有下载,则会显示之前页面的图片,他们应该停止下载。
所以我尝试使用线程.. 在API ..
- (void)scrollViewDidEndDecelerating:(UIScrollView *)sender{
Step 1) calculated currentPageNumber
Step 2) started thread for downloading image with url for this currentPage
//startBackGroundThreadForPlaceImage:(NSURL *) url
Step 3)stopped thread for previous page , if that is still running
}
现在我的MyCustomImageDownloaderController为
-(void) startBackGroundThreadForPlaceImage:(NSURL *) url{
if(isImageDownloaded == NO){
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//[self performSelectorInBackground:@selector(loadImageInBackground:) withObject:imageUrl];
myThread = [[NSThread alloc] initWithTarget:self selector:@selector(loadImageInBackground:) object:imageUrl];
//[NSThread detachNewThreadSelector:@selector(loadImageInBackground:) toTarget:self withObject:imageUrl];
[myThread start];
NSLog(@"The current thread is %@ ", [[NSThread currentThread] name]);
[pool release];
}
}
NOW Here选择器执行加载图像和分配到图像视图的工作
现在停止线程
-(void) stopBackgroundThread{
[myThread cancel];
//[[NSThread currentThread] cancel];
//if([[NSThread currentThread] isCancelled]) {
//[NSThread exit];
//}
[NSThread exit];
}
-(BOOL) isThreadRunning{
return [myThread isExecuting];
}
所以我尝试了很多东西,但无法阻止它们之间的线程..
基本上一次使用三种方法中的任何一种实例化线程
1)在BackGround中执行选择器
2)NSThread分离新主题
3)NSThread alloc..init with ..
在前2个方法中如何获取新创建的线程的实例,以便我可以弯腰,
作为NSThread currentThread doest not not that
方法3中的,
myThread = [[NSThread alloc] initWithTarget:self selector:@selector(loadImageInBackground:) object:imageUrl];
当我尝试
时[myThread cancel];
它没有取消那个帖子,
当我尝试
时[NSThread exit];
它挂在当前屏幕上,,,,我猜它已经停止了主线程
请帮帮我
先谢谢* 强文 *
答案 0 :(得分:3)
通常最好要求线程停止,而不是强制它,这应该被视为最后的手段。因此,您应经常检查“停止标志”,并在设置此项时终止当前线程(在这种情况下,只需退出方法)。你只需要在线程运行的类上提供一个属性,这样调用者就可以让线程停止。
在C ++或Java中没有什么不同。