创建一个 Class 在 Swift 中发出 HTTPRequest
Create a Class that Makes HTTPRequest in Swift
我正在制作一个需要在其许多 ViewController 中发出 HTTP 请求的应用程序。
我最终将这些代码复制并粘贴到每个 ViewController 中,并监听 NSURLConnectionDelegate 和 NSURLConnectionDataDelegate 的委托回调
func makeRequest()
{
//Base64
var username = "testUsername";
var password = "testPassword";
var loginString = NSString(format: "%@:%@", username, password);
var loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)!;
var base64LoginString = loginData.base64EncodedStringWithOptions(nil);
var url: NSURL = NSURL(string: self.HTTP_REQUEST_STRING)!;
var urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: url);
urlRequest.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization");
urlRequest.HTTPMethod = "POST";
urlConnection = NSURLConnection(request: urlRequest, delegate: self)!;
}
func connection(connection: NSURLConnection!, didReceiveData data: NSData!)
{
self.resultData.appendData(data);
}
func connectionDidFinishLoading(connection: NSURLConnection!)
{
//Do Something
}
func connection(connection: NSURLConnection, didFailWithError error: NSError)
{
//Do Something
}
我想知道是否有比这更好的方法,而不是将代码复制并粘贴到每个 ViewController 中?
是否可以将这些代码放入class?但是,我们如何知道连接是否已完成加载?
很抱歉这个问题,我缺乏良好的面向对象设计知识。
谢谢
为了保持最新,您应该使用 NSURLSession
作为您的请求 class。您不一定需要监听委托回调,因为有一个闭包回调会根据您配置会话的方式为您提供错误和数据。关于放置,这取决于您的代码和您想要的内容。如果有意义,您可以将此代码放在 viewController 中,有些人创建代理 classes 来发出他们的所有请求并向他们报告状态。这完全取决于应用程序的灵活性、稳健性和结构。如果您从 3 个不同的 viewController 发出相同的网络请求,您可能应该将网络请求放在一种代理 class 中以防止重复代码。如果您想了解有关代码设计的更多信息,请查看代理和单例设计模式。
这里有一个关于 NSURLSession
的很好的入门教程:
Raywenderlich tutorial
就像其他人提到的那样,您要学习的东西远远多于 SO 上的单个答案所能提供的。同时,看看 Alamofire,这是一个围绕 NSURLSession
构建的相当全面的网络库。您将在其中找到用于创建请求等的代码。 Alamofire 提供了一种预构建的 OO 方式来执行网络请求,适用于一次性请求或整个网络管理器 class.
我正在制作一个需要在其许多 ViewController 中发出 HTTP 请求的应用程序。
我最终将这些代码复制并粘贴到每个 ViewController 中,并监听 NSURLConnectionDelegate 和 NSURLConnectionDataDelegate 的委托回调
func makeRequest()
{
//Base64
var username = "testUsername";
var password = "testPassword";
var loginString = NSString(format: "%@:%@", username, password);
var loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)!;
var base64LoginString = loginData.base64EncodedStringWithOptions(nil);
var url: NSURL = NSURL(string: self.HTTP_REQUEST_STRING)!;
var urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: url);
urlRequest.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization");
urlRequest.HTTPMethod = "POST";
urlConnection = NSURLConnection(request: urlRequest, delegate: self)!;
}
func connection(connection: NSURLConnection!, didReceiveData data: NSData!)
{
self.resultData.appendData(data);
}
func connectionDidFinishLoading(connection: NSURLConnection!)
{
//Do Something
}
func connection(connection: NSURLConnection, didFailWithError error: NSError)
{
//Do Something
}
我想知道是否有比这更好的方法,而不是将代码复制并粘贴到每个 ViewController 中?
是否可以将这些代码放入class?但是,我们如何知道连接是否已完成加载?
很抱歉这个问题,我缺乏良好的面向对象设计知识。
谢谢
为了保持最新,您应该使用 NSURLSession
作为您的请求 class。您不一定需要监听委托回调,因为有一个闭包回调会根据您配置会话的方式为您提供错误和数据。关于放置,这取决于您的代码和您想要的内容。如果有意义,您可以将此代码放在 viewController 中,有些人创建代理 classes 来发出他们的所有请求并向他们报告状态。这完全取决于应用程序的灵活性、稳健性和结构。如果您从 3 个不同的 viewController 发出相同的网络请求,您可能应该将网络请求放在一种代理 class 中以防止重复代码。如果您想了解有关代码设计的更多信息,请查看代理和单例设计模式。
这里有一个关于 NSURLSession
的很好的入门教程:
Raywenderlich tutorial
就像其他人提到的那样,您要学习的东西远远多于 SO 上的单个答案所能提供的。同时,看看 Alamofire,这是一个围绕 NSURLSession
构建的相当全面的网络库。您将在其中找到用于创建请求等的代码。 Alamofire 提供了一种预构建的 OO 方式来执行网络请求,适用于一次性请求或整个网络管理器 class.