Lớp Khả năng hiển thị và -reachabilityWithHostname:
được thiết kế để có cơ chế nhanh, không nhanh để xác định xem bạn có kết nối mạng cơ bản với máy chủ hay không. Nếu bạn cần xác minh rằng một URL cụ thể có thể được tải xuống, bạn cần phải xem xét sử dụng NSURLConnection
để truy xuất nội dung của URL để xác minh rằng URL đó thực sự có sẵn.
Tùy thuộc vào việc bạn cần phải làm điều này trong foreground hoặc background, bạn có thể sử dụng đơn giản nhưng chặn:
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error
hoặc bạn có thể sử dụng phương pháp phức tạp hơn của việc tạo ra một đối tượng NSURLConnection, thiết lập một đại biểu để nhận câu trả lời và chờ đợi với những phản hồi đến trong
đối với trường hợp đơn giản:.
NSURL *myURL = [NSURL URLWithString: @"http://example.com/service.asmx"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: myURL];
[request setHTTPMethod: @"HEAD"];
NSURLResponse *response;
NSError *error;
NSData *myData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error];
Nếu bạn nhận lại một on-nil myData, bạn đã có một số loại kết nối. response
và error
sẽ cho bạn biết những gì máy chủ trả lời cho bạn (trong trường hợp phản hồi và nếu bạn nhận được một myData không phải là nil) hoặc loại lỗi nào xảy ra, trong trường hợp của myData không phải.
Đối với trường hợp không tầm thường, bạn có thể nhận được hướng dẫn tốt từ số Using NSURLConnection của Apple.
Nếu bạn không muốn ngăn chặn quá trình tiền cảnh của mình, bạn có thể thực hiện hai cách khác nhau này. Tài liệu trên sẽ cung cấp thông tin về cách thực hiện ủy nhiệm, vv Tuy nhiên, việc triển khai đơn giản hơn là sử dụng GCD để gửi yêu cầu Đồng bộ trên một chuỗi nền, và sau đó tự tin nhắn lên luồng chính khi bạn hoàn tất.
Something như thế này:
NSURL *myURL = [NSURL URLWithString: @"http://example.com/service.asmx"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: myURL];
[request setHTTPMethod: @"HEAD"];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, NULL), ^{
NSURLResponse *response;
NSError *error;
NSData *myData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error];
BOOL reachable;
if (myData) {
// we are probably reachable, check the response
reachable=YES;
} else {
// we are probably not reachable, check the error:
reachable=NO;
}
// now call ourselves back on the main thread
dispatch_async(dispatch_get_main_queue(), ^{
[self setReachability: reachable];
});
});
reachability là duy nhất ở đó để kiểm tra xem bạn có thể truy cập internet để bạn có thể xác định xem bạn nên cảnh báo người dùng và do đó sử dụng dữ liệu được lưu trữ. Đây là một phần của hướng dẫn của Apple về tương tác của người dùng. Nếu bạn muốn kiểm tra một URL cụ thể, sau đó thử truy cập URL đó, đặt thời gian chờ thành rất nhỏ và bắt lỗi. –