簡體   English   中英

為什么NSURLConnection阻止我的UI?

[英]Why NSURLConnection blocks my UI?

我一直在閱讀有關此問題的多個主題和問題,但沒有找到解決方案。

我執行了一些異步調用

[NSURLConnection connectionWithRequest:anURLRequest delegate:self];

問題是我希望該接口可操作,但是直到連接完成才被阻塞。

這解決了啟動另一個線程的問題嗎? 問題到底出在哪里?

編輯

好的,在檢索數據后,我使用NSXMLParser對其進行了解析,然后同步處理並阻塞了主線程。 這個對嗎? 然后,也許我需要解析另一個線程。 有人指導嗎?

從文檔:

發送給委托的消息將在調用此方法的線程上發送。 為了使連接正常工作,調用線程的運行循環必須在默認的運行循環模式下運行。

您確定此代碼是在默認模式下的運行循環上調用的,而不是從您自己使用其他類型的運行循環模式創建的線程中調用的嗎?

使用connectionWithRequest時,UI不應處於鎖定狀態。 嘗試在用戶界面中創建標簽,並讓您的連接使用當前數據量對其進行更新,如下所示:

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

connectionWithRequest確實確實在其自己的線程中運行-無需您為此擔心。 實際上,它必須從主線程啟動。 查看NSUrlConnection文檔以獲取更多信息。

+ (id)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate];

此方法應創建一個異步請求(這意味着它在后台運行,並且不會阻止UI)。 您應該檢查文件中是否存在阻止UI的其他類/方法(例如NSData的'+(NSData *)dataWithContentsOfURL:(NSURL *)URL')。

我不知道它是否可以幫助任何人,但是我遇到了同樣的問題(異步URL請求阻止了UI),但這是由於:

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

在connectionDidReceiveData方法中。

就我而言,我試圖更新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];
}

現在,進度視圖更新沒有問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM