【问题标题】:Problem with hiding modalviewcontroller using ASIHTTPRequest使用 ASIHTTPRequest 隐藏 modalviewcontroller 的问题
【发布时间】:2011-08-02 21:23:00
【问题描述】:

当我使用 ASIHttpRequest 连接到服务器时,我遇到了隐藏 modalviewcontroller 的问题。 我在后台线程中连接并在主线程中显示模态视图。 这是我的代码:

    [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];
}

它并没有解决我的问题。 有任何想法吗?还是有什么问题?

【问题讨论】:

    标签: iphone objective-c ipad asihttprequest


    【解决方案1】:

    您正在混合使用异步和同步方法。

    您将请求设置为异步请求,然后调用[request startSynchronous];

    因此,不会调用委托方法,也不会关闭您的模式。

    解决方法是使用 [request startAsynchronous]; 触发异步请求

    这也意味着您不需要调用performSelectorInBackground(或在loginServerRequest 方法中设置自动释放池)。

    【讨论】:

      【解决方案2】:

      在您的异步版本中,将[self hideServerConnectView]; 移动到[self loginServerRequest]; 之后

      或者使用- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait 调用- (void)hideServerConnectView,因为UI 更新必须在主线程上进行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多