我是iOS编程的新手,没有面向对象的编程背景。
我有一个应用程序,它本质上是几个Web API的用户界面。
我有一个Reachability类,可以让我检查是否有有效的互联网连接。当用户在登录页面上并且没有其他操作时,这很有效。
然而,假设我有一个带有5个按钮的视图,所有这些都需要互联网连接才能工作。我是否只需要每个按钮调用此Reachability.isConnected() - >在实际进行API调用之前的Bool方法?
我担心这不是正确的逻辑。我是否应该有后台程序来定期检查连接?
由于缺乏OOP经验,我将这个功能分解为离散类,因此我遇到了问题。
有关处理此连接检查的最佳方法的任何建议都会很棒。
答案 0 :(得分:5)
要检查连接网络,您必须创建一个类,例如将其放在“服务”文件夹中,然后复制以下代码:
import Foundation
import SystemConfiguration
public class Reachability {
class func isConnectedToNetwork() -> Bool {
var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, UnsafePointer($0))
}
var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0)
if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false {
return false
}
let isReachable = flags == .Reachable
let needsConnection = flags == .ConnectionRequired
return isReachable && !needsConnection
}
}
然后,在任何您想要的地方使用它:
if Reachability.isConnectedToNetwork() {
// Do stuff if you're connected to the internet
}
else {
// Do stuff if you're not connected to the internet
}
希望它可以帮到你;)
答案 1 :(得分:0)
包括可达性
然后有这样的方法。
对于目标C: -
+ (BOOL)internetAvailable
{
// check if we've got network connectivity
Reachability *myNetwork = [Reachability reachabilityWithHostname:@"google.com"];
NetworkStatus myStatus = [myNetwork currentReachabilityStatus];
switch (myStatus)
{
case NotReachable:
return NO;
break;
case ReachableViaWWAN:
return YES;
break;
case ReachableViaWiFi:
return YES;
break;
default:
return YES;
break;
}
}
编辑: -
对于swift: -
import Foundation
import SystemConfiguration
public class Reachability {
class func isConnectedToNetwork() -> Bool {
var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)).takeRetainedValue()
}
var flags: SCNetworkReachabilityFlags = 0
if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == 0 {
return false
}
let isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0
let needsConnection = (flags & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
return isReachable && !needsConnection
}
}
只要在需要的地方调用这些方法。
答案 2 :(得分:0)
有两种方法可以检查网络连接,您可以设置观察者进行网络连接更改,以便在网络连接状态发生变化(连接或断开连接)时收到通知。
(您可以使用iOS Reachability类检查网络连接,也可以使用AFNetworking库)
如果您想要持续监控网络更改,您应该按如下方式设置观察者:
将此代码添加到AppDelegate中的didFinishLaunchingWithOptions
NSNotificationCenter.defaultCenter().addObserver(self, selector:"checkNetworkStatus", name: ReachabilityChangedNotification, object: nil);
do{self.reachability = try Reachability.reachabilityForInternetConnection()}catch{}
do{try self.reachability.startNotifier()}catch{
}
self.performSelector("checkNetworkStatus", withObject: nil, afterDelay: 0.6)
将以下代码添加到AppDelegate
var networkStatus : Reachability.NetworkStatus!
var objNetworkStatusView : NetworkStatusView! = nil
func checkNetworkStatus()
{
networkStatus = reachability.currentReachabilityStatus
if (networkStatus == Reachability.NetworkStatus.NotReachable)
{
print("Not Reachable")
objNetworkStatusView = NetworkStatusView(frame:CGRectMake(0, 0, self.window!.frame.size.width, self.window!.frame.size.height))
UIApplication.sharedApplication().keyWindow?.addSubview(objNetworkStatusView)
UIApplication.sharedApplication().keyWindow?.bringSubviewToFront(objNetworkStatusView)
}
else
{
print("Reachable")
if((objNetworkStatusView) != nil)
{
objNetworkStatusView.removeFromSuperview()
}
}
}
如果您只是想在向服务提出请求之前检查网络连接,则应按如下方式手动检查网络连接:
在您必须调用Web服务的类中创建委托实例,或者您必须检查网络连接,
let delegate = UIApplication.sharedApplication().delegate as! AppDelegate
并将网络连接检查为
if (delegate.networkStatus==Reachability.NetworkStatus.NotReachable) {
delegate.checkNetworkStatus()
} else {
//You can call web service here
}