2009-11-09 4 views
1

Я пользуюсь частным MBProgressHUDУстранение ситуации ожидания для отдельной ветки в IPhone?

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

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] 

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

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

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

ответ

1

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

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

Чтобы использовать performSelectorOnMainThread, определите новый метод, поместите в него свой код и вызовите функцию 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]; 

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

+0

вы можете объяснить, как использовать performSelectorOnMainThread? – harshalb

+0

Я сделал со вторым сценарием, поместив код в hudWasHidden – harshalb

+0

Его работа отлично со вторым сценарием. – harshalb

1

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

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

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

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

не работает, так как matej сказал, что может иметь конфликт uikit с потоком. В MBProgressHUD есть метод, в котором создается поток, и он конфликтует с любыми действиями uikit, которые я делаю int в этом методе. – harshalb