Попробуйте выделить HUD
на viewWillAppear:
вместо -(IBAction)save
, потому что иногда распределение занимает все время, и к тому времени, когда оно выделяет всю задачу, заканчивается.
Скопируйте следующие ссылки на viewWillAppear:
и удалите их из -(IBAction)save
HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view];
[self.navigationController.view addSubview:HUD];
HUD.delegate = self;
HUD.labelText = @"Saving...";
РЕДАКТИРОВАТЬ: Сохраните распределение на viewWillAppear:
и измените код, как показано ниже:
- (IBAction)save {
[NSThread detachNewThreadSelector:@selector(showHUD) withObject:nil];
[self performSelectorOnMainThread:@selector(savingPage) withObject:nil waitUntilDone:YES];
}
- (void) savingPage{
NSString *title = [page stringByEvaluatingJavaScriptFromString:@"document.title"];
SavePageAs *savePage = [[SavePageAs alloc] initWithUrl:self.site directory:title];
[savePage save];
[HUD hide:YES];
}
-(void)showHUD {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[HUD show:YES];
[pool release];
}
Это создаст отдельный поток для отображения HUD, поскольку основной поток задействуется методом savePage.
Если это тоже не работает, просто измените waitUntilDone:YES
на waitUntilDone:NO
Примечание: Согласно Документация Apple
Внимание! Если вы используете автоматический подсчет ссылок (ARC), вы не сможете
используйте авто-релизные пулы напрямую. Вместо этого вы используете @autoreleasepool
блоки вместо Например, вместо:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init;
// Code benefitting from a local autorelease pool.
[pool release];
вы бы написали:
@autoreleasepool {
// Code benefitting from a local autorelease pool.
}
@ блоки autoreleasepool более эффективны, чем использование экземпляра
NSAutoreleasePool напрямую; Вы также можете использовать их, даже если вы этого не сделаете
используйте ARC.
Надеюсь, это поможет.