标签: nsurlsession

Swift:阻塞mainThread,直到函数用completionHandler加载数据/ NSURLSession

我想创建一个从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)

completionhandler nsurlsession swift

0
推荐指数
1
解决办法
1235
查看次数

如何使用NSURLSession处理丢失的Internet连接?


我正在使用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)

ios nsurlsession swift

0
推荐指数
1
解决办法
2199
查看次数

不调用NSURLSessionDataTask委托方法

我试图从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)

objective-c ios nsurlsession

0
推荐指数
1
解决办法
4392
查看次数

NSURLSession身份验证

我试图用找到的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)

xcode ios nsurlsession swift2

0
推荐指数
1
解决办法
452
查看次数

为什么NSURLSession.dataTaskWithURL()不调用我的完成处理程序?

我正在尝试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文件.但完成处理程序永远不会被调用.它永远不会在我在完成处理程序中设置的断点处停止,并且调试器日志中不会显示任何输出.

我已经尝试使用完成处理程序在一个单独的函数而不是一个闭包,但行为是相同的.

谁能告诉我为什么我的完成处理程序没有被调用?

json ios nsurlsession swift

0
推荐指数
1
解决办法
413
查看次数

在命令行工具上使用 Swift URLSession 示例代码

我试图找出从命令行在 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至无法发出简单的请求才能正常工作......

foundation nsurlsession swift

0
推荐指数
1
解决办法
4459
查看次数

如何删除警告“从‘Any’到‘AnyObject’的条件转换总是成功”

我创建了一个类,当我尝试将对象转换为 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)

ios nsjsonserialization nsurlsession swift

0
推荐指数
1
解决办法
5267
查看次数

检查 Internet 访问是否可用

在我的应用程序中,我只想在可以访问互联网的情况下拨打网络电话。

注意:我连接到没有互联网的 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

0
推荐指数
1
解决办法
394
查看次数

如何在 swift 4 中没有库的情况下在 api 中发送授权类型承载令牌?

我需要在 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)

使用此代码我得到令牌过期。邮递员是这样称呼它的:

在此处输入图片说明

在邮递员中,我得到了回应。我认为我发送令牌的方式有问题。任何帮助。

ios nsurlsession postman swift

0
推荐指数
1
解决办法
751
查看次数

Xamarin 的 WindowsAzure.Storage 库是否使用 NSUrlSession 进行文件上传?

问题陈述:我们需要将日志数据从 Xamarin.IOS 应用程序上传到 Azure 存储。日志不是由应用程序的用户创建的,并且在生成日志后,用户在任何时间内保持应用程序打开没有任何限制。我们希望可靠地上传我们的日志,并牢记以下几点:

  • 用户可能会将应用程序发送到后台
  • 文件大小可达 15MB
  • 当我们得到它们时,我们不在乎。我们愿意为此安排任务。

在查看此问题的潜在解决方案时,Xamarin 文档指出在 iOS7+ 中:

NSURLSession 允许我们创建任务来:

  1. 通过网络和设备中断传输内容。
  2. 上传和下载大文件(后台传输服务)。

所以看起来 NSURLSession 是这类工作的一个很好的候选者,但我想知道我是否在重新发明轮子。WindowsAzure.Storage客户端库是否尊重应用后台基于NSURLSession的上传实现,或者如果我想在后台上传数据,是否需要上传到我用POST方法控制的中间服务器,然后中继数据到 Azure 存储?公共 Azure 文档中似乎没有任何迹象表明可以通过计划任务完成上传。

azure xamarin.ios azure-storage-blobs xamarin nsurlsession

0
推荐指数
1
解决办法
150
查看次数

如何使用Swift 2 + XCode 7 + iOS 9获取和解析JSON

正在寻找与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?

json ios nsurlsession swift2

-1
推荐指数
1
解决办法
2万
查看次数