我想创建一个从url加载数据然后将responseData作为NSData返回的函数.我想阻止mainThread直到数据完成.这是我到目前为止:
功能:
typealias CompletionBlock = (NSData!, NSURLResponse!, NSError!) -> NSData
func requestURL(targetUrl: String, httpMethod: String, httpBody: String, completion: CompletionBlock){
// REQUEST
let target = NSURL(string: targetUrl) // URL
let request = NSMutableURLRequest(URL: target!) // REQUEST
// HTTP-METHOD
var method = httpMethod
if method != "POST" { method = "GET" } // STANDARD: GET
request.HTTPMethod = method
// HTTP-BODY
let body = httpBody
if body != "" {
request.HTTPBody = body.dataUsingEncoding(NSUTF8StringEncoding)
}
// NSURLSession
let session = NSURLSession.sharedSession()
let task = …Run Code Online (Sandbox Code Playgroud)
我正在使用NSURL从网站抓取HTML。问题是,如果在NSURL请求期间互联网中断,则应用程序崩溃。
码:
let myUrl = NSURL(string: "http://www.mywebsite.com/page.html")
let request = NSMutableURLRequest(URL: myUrl!)
request.HTTPMethod = "POST"
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
if error != nil {
print("Error: \(error)")
}
dispatch_async(dispatch_get_main_queue()) {
self.testLabel.text = "\(responseString!)"
}
}
}
task.resume()
Run Code Online (Sandbox Code Playgroud)
我可以使用以下代码在NSURL连接之前检查互联网连接,但是在操作过程中仍然存在互联网中断的可能性:
在NSURL之前进行互联网连接检查的代码:
let myUrl = NSURL(string: "http://www.mywebsite.com/page.html")
let request = NSMutableURLRequest(URL: myUrl!)
request.HTTPMethod = "POST"
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
let responseString …Run Code Online (Sandbox Code Playgroud) 我试图从API下载一些JSON.现在什么都没打印出来.
我肯定知道路径和API Key/Value是有效的,因为我使用NSURLSessionDataTask和完成处理程序来完成它,但我想学习如何使用委托方法做同样的事情.
但我似乎无法弄清楚为什么我的委托方法没有被调用.
@interface MetaData () <NSURLSessionDelegate, NSURLSessionDataDelegate>
@end
@implementation MetaData
-(void)downloadData
{
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
[sessionConfig setHTTPAdditionalHeaders:@{ header : key}];
NSURLSession *defaultSesh = [NSURLSession sessionWithConfiguration:sessionConfig];
NSURLSessionDataTask *dataTask = [defaultSesh dataTaskWithURL:[NSURL URLWithString:path]];
defaultSesh = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
[dataTask resume];
}
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
{
NSLog(@"here 2");
}
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
NSLog(@"here");
_weaponDictionary = [NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:nil];
NSLog(@"dictionary: %@", _weaponDictionary);
}
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助.
编辑
defaultSesh …Run Code Online (Sandbox Code Playgroud) 我试图用找到的SWIFT代码在这里找到自己的网站上这里,但响应与两个错误的html代码:"你必须输入密码!" 并且"您必须输入用户名!" 我是NSURLSession的新手并尝试更改字符串以进行身份验证,但没有任何方法可以更改响应.这是我的代码:
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let userPasswordString = "username@gmail.com:password"
let userPasswordData = userPasswordString.dataUsingEncoding(NSUTF8StringEncoding)
let base64EncodedCredential = userPasswordData!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)
let authString = "Basic \(base64EncodedCredential)"
config.HTTPAdditionalHeaders = ["Authorization" : authString]
let session = NSURLSession(configuration: config)
var running = false
let url = NSURL(string: "https://hac.chicousd.org/")
let task = session.dataTaskWithURL(url!) {
(let data, let response, let error) in
if (response as? NSHTTPURLResponse) != nil {
let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding)
print(dataString)
}
running = false
}
running …Run Code Online (Sandbox Code Playgroud) 我正在尝试JSON从Web服务器加载文件.以下是我启动请求的方式:
let url:NSURL? = NSURL(string: lookupUrlFragment + query)
// Check if an actual url object was created
if let actualUrl = url {
// Create a default NSURLSessionConfiguration
let sessionConfig:NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
// Create a default session
let session:NSURLSession = NSURLSession(configuration: sessionConfig)
session.dataTaskWithURL(actualUrl, completionHandler: {
(data:NSData?, response:NSURLResponse?, error:NSError?) in
NSLog("Got data = \(data)")
NSLog("Got response = \(response)")
NSLog("Got error = \(error)")
self.searchResults = data
self.delegate?.searchResultsAreReady()
})
}
Run Code Online (Sandbox Code Playgroud)
我已经使用调试器完成了这段代码.当它调用dataTaskWithURL()实际Url的值是正确的.如果我从网络浏览器点击它,我会得到该JSON文件.但完成处理程序永远不会被调用.它永远不会在我在完成处理程序中设置的断点处停止,并且调试器日志中不会显示任何输出.
我已经尝试使用完成处理程序在一个单独的函数而不是一个闭包,但行为是相同的.
谁能告诉我为什么我的完成处理程序没有被调用?
我试图找出从命令行在 Swift 4 中发出 HTTP 请求的最简单方法。我从URLSession 编程指南中复制了这段代码,并添加了几个打印语句。我无法弄清楚为什么.dataTask没有执行。
print("Testing URLSession")
let sessionWithoutADelegate = URLSession(configuration: URLSessionConfiguration.default)
if let url = URL(string: "https://www.example.com/") {
print("Encoded url \(url)")
(sessionWithoutADelegate.dataTask(with: url) { (data, response, error) in
print("Executing dataTask")
if let error = error {
print("Error: \(error)")
} else if let response = response,
let data = data,
let string = String(data: data, encoding: .utf8) {
print("Response: \(response)")
print("DATA:\n\(string)\nEND DATA\n")
}
}).resume()
}
Run Code Online (Sandbox Code Playgroud)
目标是从 REST api 检索数据,但我什GET至无法发出简单的请求才能正常工作......
我创建了一个类,当我尝试将对象转换为 AnyObject 时收到一条警告消息。警告是:“从‘Any’到‘AnyObject’的条件转换总是成功”如何从我的文件中删除此警告?
这是我的代码:
class WebServices
{
class func getRequest( urlString: String, successBlock :@escaping (_ response :AnyObject)->Void, errorMsg:@escaping (_ errorMessage :String)->Void )
{
var request = URLRequest(url: URL(string: urlString)!)
request.httpMethod = "GET"
let task = URLSession.shared.dataTask(with: request) { (data, urlResponse, error) in
DispatchQueue.main.async {
if(error == nil)
{
do {
// Here is the warning
let responseJSON = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? AnyObject
guard let _ = responseJSON else {
errorMsg("Some error has been occurred!")
return
}
successBlock(responseJSON!) …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我只想在可以访问互联网的情况下拨打网络电话。
注意:我连接到没有互联网的 WiFi 点
我想测试互联网是否可用。我尝试使用这里描述的可达性,我也尝试了一个更简单的解决方案,如这里描述
问题在于 Reachability 会返回 Internet 可达的信息,而当它不可达时。另一种解决方案需要太多时间才能做出响应。我试图为请求和会话设置超时间隔,但它被忽略了。
如果我连接到没有互联网的 wifi,如何测试互联网可达性?
这是我使用的一些代码:
- (void) postAsyncTaskWithUrl:(NSString*)urlString
andType:(NSString*)requestType
andToken:(NSString*)token
andPropertiesObject:(id)propObject
urlEncoded:(BOOL)isUrlEncoded
withSuccess:(nullable void(^)(id _Nullable))success
andFailure:(nullable void(^)(id _Nullable))failure
{
internetReachableFoo = [Reachability reachabilityWithHostname:@"www.google.com"];
__weak typeof(self) weakSelf = self;
// Internet is reachable
internetReachableFoo.reachableBlock = ^(Reachability*reach)
{
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlSt];
[request setTimeoutInterval:20]; //Ignored ... WHY?
NSURLSessionConfiguration *sessionConfigurations = [NSURLSessionConfiguration defaultSessionConfiguration];
[sessionConfigurations setTimeoutIntervalForRequest:20]; //Ignored ... WHY?
[sessionConfigurations setTimeoutIntervalForResource:20]; //Ignored ... WHY?
// NSURLSession *session = [NSURLSession sharedSession]; …Run Code Online (Sandbox Code Playgroud) nsurlrequest reachability ios nsurlsession nsurlsessionconfiguration
我需要在 api 调用中发送令牌。我在邮递员那里得到了回应,但在我的程序中却没有。这是我用来在 api 中发送令牌的代码:
func getUserDetail(methodName:String,methodType:String ,finished: @escaping ((_ responseData: Data)->Void))
{
let url = URL(string: "\(globalURL)api/v1/\(methodName)")
var request = URLRequest(url: url!)
request.httpMethod = "GET"
request.addValue(AuthTokenString, forHTTPHeaderField: "token")
let task = URLSession.shared.dataTask(with: request) { data, response, error in
//parsing response
}
task.resume()
}
Run Code Online (Sandbox Code Playgroud)
使用此代码我得到令牌过期。邮递员是这样称呼它的:
在邮递员中,我得到了回应。我认为我发送令牌的方式有问题。任何帮助。
问题陈述:我们需要将日志数据从 Xamarin.IOS 应用程序上传到 Azure 存储。日志不是由应用程序的用户创建的,并且在生成日志后,用户在任何时间内保持应用程序打开没有任何限制。我们希望可靠地上传我们的日志,并牢记以下几点:
在查看此问题的潜在解决方案时,Xamarin 文档指出在 iOS7+ 中:
NSURLSession 允许我们创建任务来:
- 通过网络和设备中断传输内容。
- 上传和下载大文件(后台传输服务)。
所以看起来 NSURLSession 是这类工作的一个很好的候选者,但我想知道我是否在重新发明轮子。WindowsAzure.Storage客户端库是否尊重应用后台基于NSURLSession的上传实现,或者如果我想在后台上传数据,是否需要上传到我用POST方法控制的中间服务器,然后中继数据到 Azure 存储?公共 Azure 文档中似乎没有任何迹象表明可以通过计划任务完成上传。
正在寻找与Swift 2和iOS 9联网的有用教程,但似乎该主题没有在线内容.我已经看过WWDC会话网络与NSURLSession但我无法调整iOS9的新API以获取和解析JSON数据的异步方式.我尝试过的:
do {
if let url = NSURL(string: "site/api.php?option=fetchOps"),
let data = NSData(contentsOfURL: url),
let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [[String:AnyObject]] {
}
} catch let error as NSError {
print(error.description)
}
Run Code Online (Sandbox Code Playgroud)
请分享您在iOS9和Swift2上的网络体验,任何最佳实践可能是Singleton类的网络和解析可能是一个ORM?
nsurlsession ×11
ios ×8
swift ×6
json ×2
swift2 ×2
azure ×1
foundation ×1
nsurlrequest ×1
objective-c ×1
postman ×1
reachability ×1
xamarin ×1
xamarin.ios ×1
xcode ×1