Разрешение ситуации ожидания для отдельного потока в IPhone?

Я использую частный MBProgressHUD

Теперь я использую отображение индикатора на кнопке добавления, в котором я вызываю службу addrecord.

UIWindow *window = [UIApplication sharedApplication].keyWindow;
HUD = [[MBProgressHUD alloc] initWithWindow:window];

// Add HUD to screen
[window addSubview:HUD];

// Regisete for HUD callbacks so we can remove it from the window at the right time
HUD.delegate = self;

// Show the HUD while the provided method executes in a new thread
[HUD showWhileExecuting:@selector(addingToFavorites) onTarget:self withObject:nil animated:YES];

метод добавления в избранное:

NSURL *url = [NSURL URLWithString:urlstring];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0];
[request setHTTPMethod:@"GET"];
//[request setTimeoutInterval:10];
//NSURLResponse *response = nil;
//      NSError *error = nil;
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
NSData *data1= [NSURLConnection sendSynchronousRequest:request          
                                     returningResponse:nil error:nil];

if(data1 == nil)
{
    doneFlag = NO;
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Alert"
                                                   message:@"The network is not available.\n Please check the Internet connection."
                                                  delegate:nil
                                         cancelButtonTitle:@"OK"
                                         otherButtonTitles:nil];
    [alert show];
    [alert release];

}
else
{
    doneFlag = YES;

    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Confirmation"
                                                   message:@"Added To favorites" 
                                                  delegate:nil
                                         cancelButtonTitle:@"OKAY"
                                         otherButtonTitles:nil];
    [alert show];
    alert = nil;
    [alert release];        
}

[request release];

Это все работает нормально, за исключением того, что инструменты дают утечку uialertview, возможно, он конфликтует с mbprogreshud.

Поэтому я решил удалить предупреждение из вызывающего метода и поместить его в вызывающую функцию следующим образом:

метод вызова теперь:

UIWindow *window = [UIApplication sharedApplication].keyWindow;
HUD = [[MBProgressHUD alloc] initWithWindow:window];

// Add HUD to screen
[window addSubview:HUD];

// Regisete for HUD callbacks so we can remove it from the window at the right time
HUD.delegate = self;

// Show the HUD while the provided method executes in a new thread
[HUD showWhileExecuting:@selector(addingToFavorites) onTarget:self withObject:nil animated:YES];
//it should wait for the above line to be executing   ******* then to exexute the be //below condition but how ?

if (doneFlag == NO) {
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Alert"
                                                   message:@"The network is not available.\n Please check the Internet connection."
                                                  delegate:nil
                                         cancelButtonTitle:@"OK"
                                         otherButtonTitles:nil];
    [alert show];
    [alert release];
} else {
    [favoritesButton setTitle:@"Remove" forState:UIControlStateNormal];
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Confirmation"
                                                   message:@"Added To favorites" 
                                                  delegate:nil
                                         cancelButtonTitle:@"OKAY"
                                         otherButtonTitles:nil];
    [alert show];
    alert = nil;
    [alert release];        
}

метод добавления в избранное:

NSURL *url = [NSURL URLWithString:urlstring];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0];
[request setHTTPMethod:@"GET"];
//[request setTimeoutInterval:10];
//NSURLResponse *response = nil;
//      NSError *error = nil;
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
NSData *data1= [NSURLConnection sendSynchronousRequest:request          
                                     returningResponse:nil error:nil];

if(data1 == nil)
{
    doneFlag = NO;
}
else
{
    doneFlag = YES;
}

[request release];

При запуске потока progresshud отключается что-то вроде этого:

[NSThread detachNewThreadSelector:@selector(launchExecution) toTarget:self withObject:nil]

Теперь мой вопрос: если я буду следовать первому сценарию. Как я могу убедиться, что утечка оповещения не придет

Или Если я следую второму сценарию Как я могу убедиться, что условие if будет выполнено после выполнения этой строки:

[HUD showWhileExecuting:@selector(addingToFavorites) onTarget:self withObject:nil animated:YES];

2 ответа

Решение

Что касается первого сценария, вообще плохая идея делать обновления пользовательского интерфейса из потоков, отличных от основного потока приложений. UIKit НЕ является поточно-ориентированным, а выполнение потоковых обновлений пользовательского интерфейса может привести к возникновению разных странных вещей. Теперь, я не уверен, является ли это причиной утечки, но я бы избегал показывать UIAlertView в добавлении ToFoving. Используйте executeSelectorOnMainThread или второй сценарий, описанный ниже.

Что касается второго сценария, переместите все ниже вызова showWhileExecuting в метод делегата hudWasHidden. На этом этапе вы можете быть уверены, что ваш код был полностью выполнен и флаг doneFlag был установлен.

Чтобы использовать executeSelectorOnMainThread, определите новый метод, поместите в него свой код и затем вызовите executeSelectorOnMainThread.

То есть,

- (void)showAlert {
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Alert" message:@"The network is not available.\n Please check the Internet connection." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
    [alert release];
}

Позвони,

[self performSelectorOnMainThread:@selector(showAlert) withObject:nil waitUntilDone:NO];

Я бы пошел со вторым сценарием, хотя.

Несмотря на другие ответы, вы создавали утечку UIAlertView с этой последовательностью:

[alert show];
alert = nil;
[alert release];

Последние две строки должны поменяться местами:

[alert show];
[alert release];
alert = nil;
Другие вопросы по тегам