Как запустить, перезапустить и убить поток в Objective C? - PullRequest
1 голос
/ 23 февраля 2012

У меня есть функция, которая обновляет нумерацию страниц, т.е. подсчитывает общее количество страниц.

   - (void) updatePagination{
       if(!paginating){
            NSLog(@"Pagination Started!");
            paginating = YES;
            totalPagesCount=0;
            for (UIGestureRecognizer *gr in self.pageViewController.gestureRecognizers) {
                [gr setEnabled:NO];
            }          
           [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

           [self loadSpine:currentSpineIndex atPageIndex:currentPageInSpineIndex];
            [[loadedEpub.spineArray objectAtIndex:0] setDelegate:self];

//This Line calls method of another class

[[loadedEpub.spineArray objectAtIndex:0] loadChapterWithWindowSize:webView.bounds fontPercentSize:currentTextSize];


                       [currentPageLabel setText:@"?/?"];
        }
    }
}

Это метод, который он вызывает

- (void) loadChapterWithWindowSize:(CGRect)theWindowSize fontPercentSize:(int) theFontPercentSize{
    fontPercentSize = theFontPercentSize;
    windowSize = theWindowSize;

    UIWebView* webView = [[UIWebView alloc] initWithFrame:windowSize];
    [webView setDelegate:self];
    NSURLRequest* urlRequest = [NSURLRequest requestWithURL:[NSURL fileURLWithPath:spinePath]];
    [webView loadRequest:urlRequest];
}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{

    [webView dealloc];
}

- (void) webViewDidFinishLoad:(UIWebView*)webView{
    NSString *varMySheet = @"var mySheet = document.styleSheets[0];";

    NSString *addCSSRule =  @"function addCSSRule(selector, newRule) {"
    "if (mySheet.addRule) {"
        "mySheet.addRule(selector, newRule);"                               // For Internet Explorer
    "} else {"
        "ruleIndex = mySheet.cssRules.length;"
        "mySheet.insertRule(selector + '{' + newRule + ';}', ruleIndex);"   // For Firefox, Chrome, etc.
    "}"
    "}";



    NSString *insertRule1 = [NSString stringWithFormat:@"addCSSRule('html', 'padding: 0px; height: %fpx; -webkit-column-gap: 0px; -webkit-column-width: %fpx;')", webView.frame.size.height, webView.frame.size.width];
    NSString *insertRule2 = [NSString stringWithFormat:@"addCSSRule('p', 'text-align: justify;')"];
    NSString *setTextSizeRule = [NSString stringWithFormat:@"addCSSRule('body', '-webkit-text-size-adjust: %d%%;')",fontPercentSize];


    [webView stringByEvaluatingJavaScriptFromString:varMySheet];

    [webView stringByEvaluatingJavaScriptFromString:addCSSRule];

    [webView stringByEvaluatingJavaScriptFromString:insertRule1];

    [webView stringByEvaluatingJavaScriptFromString:insertRule2];

    [webView stringByEvaluatingJavaScriptFromString:setTextSizeRule];

    int totalWidth = [[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.scrollWidth"] intValue];
    pageCount = (int)((float)totalWidth/webView.bounds.size.width);



    [webView dealloc];
    [delegate chapterDidFinishLoad:self];

}

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

Мои вопросы:

  • Можно ли запускать его в фоновом режиме, и если пользователь отклоняет модальный режим, то вместо сбоя он должен остановиться.
  • Если пользователь нажимает на изменение размера шрифта, он должен остановить старый и запустить новый.
  • могу ли я использовать рассчитанные итоговые страницы, даже если их обработка все еще продолжается.

Я использовал

[self performSelectorOnMainThread:@selector(LoadChapters) withObject:nil waitUntilDone:NO]; (работает, но иногда выдает ошибку для веб-просмотра)

и NSOperation (не работает)

для вызова этой единственной строки вызова функции.

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