NSThread正在阻止我的GUI

时间:2011-11-21 12:26:52

标签: iphone user-interface nsthread

我使用NSThread从服务器端下载视频和图片。除了下载完成后我的GUI被阻止直到下载是完成。下载完成后再花几秒钟。

这是服务器请求的完成方式:

- (void) repeatRequest{
    NSLog(@"repeatRequest");
    [NSThread detachNewThreadSelector:@selector(backgroundRequest) toTarget:self withObject:nil];
}

- (void) backgroundRequest{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSURL *url = [NSURL URLWithString:myURLStr];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setDelegate:self];
    [request startAsynchronous];

    [pool drain];
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
    //do things
}

IMPORTANTAnd我也试图从ASIHTTPRequest开始GUI thread,但行为相同。

有什么可能出错的想法吗?

编辑:

- (void) viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

    [[UIApplication sharedApplication] setStatusBarHidden:YES];

    //internetReachable = [[Reachability reachabilityForInternetConnection] retain];

    if(timer1 == nil)
    {
        timer1 = [NSTimer scheduledTimerWithTimeInterval:60.0 target:self selector: @selector(repeatRequest) userInfo: nil repeats: YES];
    }

}

2 个答案:

答案 0 :(得分:2)

尝试在后台线程中运行同步ASIHTTPRequest,并处理不在委托方法(requestFinished)中的结果,但在[request startSynchronous]之后处理;

答案 1 :(得分:-1)

我对ASIHTTPRequest一无所知,但我认为它的-startAsynchronous方法已经为你处理了后台下载。这很有可能,它立即返回,你的新线程正在退出。此外,您应该在线程方法结束时使用[pool release]而不是[pool drain],它会在发布时耗尽,并且您不会泄漏NSAutoReleasePoolASIHTTPRequest是否有-startSynchronous(或只是普通-start)方法?尝试在-backgroundRequest内使用它,因为它应该阻止该线程的过早退出。