2012-02-12 14 views
23

Tôi sử dụng AFNetworking trong ứng dụng của mình cho mọi yêu cầu (như đăng nhập, lấy dữ liệu từ url, v.v.).AFNetworking và No Internet Connection scenario

Lấy ví dụ này: người dùng nhấp vào nút đăng nhập và không có kết nối, làm cách nào để hiển thị ngay một số UIAlertView có thông báo lỗi? Cách chỉ là đợi thời gian chờ yêu cầu và thực hiện khối failure? Không có cách nào kiểm tra ngay lập tức nếu có kết nối hay không?

Cảm ơn!

Trả lời

57

Tính đến 0.9, AFHTTPClient thực sự có reachability mạng built-in (một giao diện đơn giản để mã reachability nói trên của Apple). Chỉ cần bao gồm khung SystemConfiguration và sử dụng -setReachabilityStatusChangeBlock: để chỉ định phản hồi khi trạng thái khả năng hiển thị thay đổi.

+1

Hi mattt và cảm ơn bạn đã trả lời.Nhưng đề xuất của bạn là kiểm tra trạng thái kết nối internet hiện tại trước khi ** mọi phương thức ** sử dụng internet và nếu không có kết nối nào hiển thị cảnh báo? –

+3

Không, không hề. Màn hình 'AFHTTPClient' cho các thay đổi khả năng tiếp cận và thực thi khối được chỉ định khi điều đó xảy ra. Khối có một đối số duy nhất, là một boolean cho dù có hay không 'baseURL' có thể truy cập được. – mattt

+1

Tôi đã phân lớp 'AFHTTPClient' và tôi đã ghi đè' -setReachabilityStatusChangeBlock: 'bằng' NSLog (@ "test") 'bên trong nhưng câu lệnh không bao giờ được thực hiện. Tại sao? –

0

Làm thế nào về việc sử dụng Reachability?

Bạn có thể kiểm tra xem bạn có lý do chính đáng cho cố gắng kết nối trước khi bạn làm điều đó.

Có vẻ như Apple Sample Project for Reachability cho biết cách nhận trạng thái ban đầu.

+0

Đối với bất kỳ trường hợp lợi nhuận reachability không, sẽ không bất kỳ ổ cắm i/o thất bại ngay lập tức, quá? – smparkes

+0

Vâng, đó là cách Khả năng hiển thị hoạt động nhưng nó cung cấp cho bạn tính năng bổ sung như khả năng nhận thông báo khi thay đổi khả năng truy cập - gián đoạn, không bỏ phiếu. –

+0

Xin lỗi Adam, nhưng nếu mạng không được sử dụng nhưng thiết bị được kết nối và tôi kiểm tra trạng thái mạng, Khả năng hiển thị cho tôi biết tôi không có kết nối. Câu trả lời này giải thích những gì tôi sẽ nói một cách tốt hơn: http://stackoverflow.com/a/9186073/719127 –

2

Có thể bạn có thể sử dụng "Khả năng hiển thị" để xác định xem thiết bị có được kết nối với mạng hay không. Đây là liên kết tới Tài liệu Apple. : Reachability

Ví dụ:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNetworkChange:) name:kReachabilityChangedNotification object:nil]; 
reachability = [Reachability reachabilityForInternetConnection]; 
[reachability startNotifier]; 
NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus]; 
if(remoteHostStatus == NotReachable) { 
    //Your UIAlertView 
} 
28

Với AFNetworking đây là những bước mà người ta phải theo để tận dụng lợi thế của setReachabilityStatusChangeBlock: sau khi thêm các lớp AFNetworing -

  1. Thêm SystemConfiguration.framework để dự án của bạn
  2. Trong file pch thêm #import <SystemConfiguration/SystemConfiguration.h>
  3. Giả sử rằng bạn có một lớp con của AFHTTPClient trong phân lớp này thêm các dòng mã dưới đây vào hàm init -
 
[self setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { 
     NSLog(@"changed %d", status); 
     //your code here 
    }]; 
2

Tôi sử dụng AFNetworkingOperationDidFinishNotification. Mỗi khi một yêu cầu http sẽ thất bại, cảnh báo bật lên và thông báo cho người dùng

- (void)addNetworkObserver 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(HTTPOperationDidFinish:) 
               name:AFNetworkingOperationDidFinishNotification 
               object:nil]; 
} 

- (void)HTTPOperationDidFinish:(NSNotification *)notification 
{ 
    AFHTTPRequestOperation *operation = (AFHTTPRequestOperation *)[notification object]; 
    if (![operation isKindOfClass:[AFHTTPRequestOperation class]]) { 
     return; 
    } 
    if (operation.error) { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Connection error" 
                 message:@"Missing connection to the internet" 
                 delegate:nil 
              cancelButtonTitle:@"OK" 
              otherButtonTitles:nil]; 

     [alert show]; 
    } 
}