代码之家  ›  专栏  ›  技术社区  ›  emenegro

为什么nsurlconnection会阻塞我的用户界面?

  •  0
  • emenegro  · 技术社区  · 16 年前

    我已经阅读了一些关于这个问题的文章和问题,但我没有找到解决办法。

    我用执行了一些异步调用

    [NSURLConnection connectionWithRequest:anURLRequest delegate:self];
    

    问题是我希望接口可以操作,但是在连接完成之前它被阻塞。

    是否解决了启动另一个线程的问题?问题到底在哪里?

    编辑

    好的,在检索数据之后,我用nsxmlparser对其进行分析,这样做是同步的,并且阻塞了主线程。这是正确的吗?然后,也许我需要在另一个线程中解析。有人有导游吗?

    5 回复  |  直到 13 年前
        1
  •  1
  •   Jasarien    16 年前

    来自文档:

    将在调用此方法的线程上向委托发送消息。为了使连接正常工作,调用线程的运行循环必须在默认的运行循环模式下运行。

    您确定在默认模式下对运行循环调用此代码,而不是从您用不同类型的运行循环模式创建的线程调用此代码吗?

        2
  •  1
  •   thomax    16 年前

    用户界面在使用时不应锁定 connectionWithRequest . 尝试在您的用户界面中创建一个标签,并让您的连接使用当前的数据量更新它,如下所示:

    - (void)downloadContentFromUrl:(NSURL *)url {   
        NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0];
        NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
        if (connection) {
            receivedData = [[NSMutableData data] retain];
            self.downloadProgressLabel.text = @"Downloading...";
        } else {
            // oh noes!
        }
    }
    
    - (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
        [receivedData setLength:0]; 
    }
    
    - (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {   
        [receivedData appendData:data]; 
        int kb = [receivedData length] / 1024;
        self.downloadProgressLabel.text = [NSString stringWithFormat:@"Downloaded\n%d kB", kb];
    }
    

    与请求的连接 确实是在它自己的线程中运行的-没有必要为此担心。实际上,它必须从主线程启动。退房 NSUrlConnection 更多信息。

        3
  •  1
  •   cutsoy    16 年前
    + (id)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate];
    

    这个方法应该创建一个异步请求(这意味着它在后台运行,并且不阻塞UI)。您应该检查文件中是否有其他类/方法阻止UI(例如nsdata的“+(nsdata*)datawithcontentsofurl:(nsurl*)url”)。

        4
  •  1
  •   Simone    15 年前

    我不知道它是否可以帮助任何人,但我有同样的问题(异步URL请求阻塞UI),但这是由于:

    NSLog(@"dataReceived: %@", data);
    

    在ConnectionDidReceiveData方法中。

        5
  •  0
  •   Ahmed    14 年前

    在我的例子中,我试图更新uiprogressview.progress属性。我这样计算新值

    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
        [self.progress setProgress:self.downloadedData.length / self.fileSize ];
        [self.downloadedData appendData:data];
    }
    

    这不起作用,我用

    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
        self.downloadedSize += data.length;
        [self.progress setProgress:self.downloadedSize / self.fileSize ];
        [self.downloadedData appendData:data];
    }
    

    现在进度视图可以毫无问题地更新了。

    推荐文章