Проблема с сокрытием modalviewcontroller с помощью ASIHTTPRequest - PullRequest
0 голосов
/ 03 августа 2011

У меня проблема со скрытием modalviewcontroller при подключении к серверу с помощью ASIHttpRequest. Я подключаюсь в фоновом потоке и показываю модалвью в основном потоке. Это мой код:

    [self performSelectorInBackground:@selector(loginServerRequest) withObject:nil];


    - (void)loginServerRequest {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSURL *url = [NSURL URLWithString:@"https://11.111.111.11/api/login"];
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    [request setPostValue:[AccountSettings getCompany] forKey:@"companyName"];
    [request setPostValue:[AccountSettings getEmail] forKey:@"email"];
    [request setPostValue:[AccountSettings getPassword] forKey:@"password"];
    [request setRequestMethod:@"POST"];
    [request setTimeOutSeconds:10];
    [request setValidatesSecureCertificate:NO];
    [request setDelegate:self];
    [request startSynchronous];
    [pool drain];
}
- (void)requestFinished:(ASIHTTPRequest *)request
{
    [self performSelector:@selector(hideServerConnectView) withObject:nil afterDelay:0.0];
    int status = [request responseStatusCode];
    NSLog(@"%i", status);
    if ([self.nibName isEqualToString:@"RootViewController"]) {
        if (status == 200) {
           //some code
        }
    }
}
- (void)hideServerConnectView {
    [self.parentViewController dismissModalViewControllerAnimated:NO];
}

Если сервер немедленно отвечает, modalviewcontroller не скрывается! Если пройти несколько секунд, то все в порядке. В чем проблема ??


Я изменил свой код так:

    [self loginServerRequest];
    ServerConnectView *viewC = [[ServerConnectView alloc] init];
    [self.view addSubview:viewC.view];
    [self presentModalViewController:viewC animated:YES];
    [viewC release];

- (void)loginServerRequest {
NSURL *url = [NSURL URLWithString:@"https://11.111.111.11/api/login"];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:[AccountSettings getCompany] forKey:@"companyName"];
[request setPostValue:[AccountSettings getEmail] forKey:@"email"];
[request setPostValue:[AccountSettings getPassword] forKey:@"password"];
[request setRequestMethod:@"POST"];
[request setTimeOutSeconds:10];
[request setValidatesSecureCertificate:NO];
[request setDelegate:self];
[request startAsynchronous];
}

- (void)requestFinished:(ASIHTTPRequest *)request{
[self hideServerConnectView];
int status = [request responseStatusCode];
NSLog(@"%i", status);
if ([self.nibName isEqualToString:@"RootViewController"]) {
    if (status == 200) {
       //some code
    }
  }
}
- (void)hideServerConnectView {
   [self.parentViewController dismissModalViewControllerAnimated:NO];
}

И это не решило мою проблему. Есть идеи? Или что-то не так?

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

Вы смешиваете асинхронные и синхронизирующие методы.

Вы настраиваете запрос, как будто это асинхронный запрос, но затем вызываете [request startSynchronous];.

Из-за этого методы делегата не будут вызваны, и ваш модальный режим не будет отклонен.

Исправление - отключить асинхронный запрос, используя [request startAsynchronous];

Это также означает, что вам не нужно вызывать performSelectorInBackground (или настраивать пул автоматического выпуска в методе loginServerRequest).

0 голосов
/ 03 сентября 2011

В вашей асинхронной версии переместите [self hideServerConnectView]; сразу после [self loginServerRequest];

ИЛИ используйте - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait для вызова - (void)hideServerConnectView, поскольку обновление пользовательского интерфейса должно происходить в главном потоке.

...