Как остановить текущий выполняющийся поток - PullRequest
1 голос
/ 21 ноября 2011

Сценарий такой -

В моем приложении есть представление прокрутки со многими экземплярами

MyCustomImageDownloaderController (содержит изображения, где изображения должны быть назначены после загрузки).

Согласно нашему требованию, изображение должно быть загружено при переходе на страницу.

Представление прокрутки + (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]; 
}

}

СЕЙЧАС Здесь селектор выполняет загрузку изображения и присваивает его виду

Теперь остановка потока

-(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 с ..

В первых двух методах, как получить экземпляр только что созданного потока, чтобы я мог его остановить,

как NSThread currentThread не дает этого

в методе 3,

myThread = [[NSThread alloc] initWithTarget:self selector:@selector(loadImageInBackground:) object:imageUrl]; 

когда я пытался

[myThread cancel];

Это не отменяло эту тему ,,

Когда я попробовал

[NSThread exit];

он висит на текущем экране ,,,, я думаю, он остановил основной поток

Пожалуйста, помогите мне

Заранее спасибо * сильный текст *

1 Ответ

3 голосов
/ 21 ноября 2011

Обычно лучше попросить остановить поток, а не заставлять его, что следует рассматривать как последнее средство.Поэтому вам следует часто проверять «флаг остановки» и, когда он устанавливается, завершать текущий поток (в этом случае просто выйдя из метода).Вам просто нужно предоставить свойство для класса, с которым работает поток, чтобы вызывающие абоненты могли попросить поток остановиться.

...