5

Tôi muốn có một cách nhanh chóng và dễ dàng để lấy dữ liệu từ URL mà không cần phải gây rối với delegates.GCD dispatch_async và NSURLConnection

Có vấn đề gì sau đây không?

// Use gcd 
dispatch_queue_t queue = dispatch_queue_create("com.dowork", 0); 
dispatch_queue_t main = dispatch_get_main_queue(); 

// do the long running work in bg async queue 
// within that, call to update UI on main thread. 
dispatch_async(queue, ^{ 

    // Do work in the background 
    NSData *response = [NSURLConnection sendSynchronousRequest:serviceRequest returningResponse:&serviceResponse error:&serviceError]; 

    dispatch_async(main, ^{ 

     // Update UI 
     self.data = response; 
     [self.tableView reloadData]; 


    });//end 
});//end 

Tôi nghĩ tôi đã đọc ở đâu đó từ lâu rằng việc sử dụng phương pháp đồng bộ NSURLConnection trong chủ đề nền sẽ gây rò rỉ bộ nhớ. Điều này có đúng không?

Có vấn đề gì với các mã được đăng ở đó không? Bất kỳ vấn đề nào với việc gán dữ liệu cho self.data trong khối?

Trả lời

4

Nếu bạn đang nhắm mục tiêu ios5 và sau đó, có NSURLConnection của sendAsynchronousRequest:queue:completionHandler:

Để trả lời câu hỏi cụ thể của bạn, có vẻ với tôi như response có thể bị rò rỉ: Tôi không biết nếu có bể bơi autorelease ngầm trên đề GCD.

Đã hoàn thành một số nghiên cứu ngay bây giờ: các chủ đề GCD có các nhóm tự động phát hành riêng của chúng nhưng bạn không biết khi nào chúng sẽ được thoát. Bạn có thể muốn đặt ngoặc kép hai câu lệnh đầu tiên với một nhóm tự động phát hiện rõ ràng.

Xem thêm Do you need to create an NSAutoreleasePool within a block in GCD?

+0

Tôi nhận ra điều đó và đã thử nghiệm một số triển khai với nó. Nhưng, nó vẫn còn hạn chế cho những gì tôi cần làm. Phương pháp tôi hiển thị ở trên là rất tốt và dễ dàng để có được 'NSData', tất cả các phương thức async khác dường như là một quá trình 2 bước với các đại biểu. Vì vậy, vẫn còn thắc mắc về câu hỏi ban đầu của tôi. –

+0

@Nic: đã cập nhật câu trả lời của tôi – JeremyP

+0

Cảm ơn bạn, vì vậy bạn nghĩ sẽ an toàn để thực hiện theo cách này, miễn là tôi thêm hồ bơi tự động phát hành của riêng mình? –