Swift 2如何隔离一系列NSMutableURLRequests中的资源?

时间:2016-08-08 02:30:29

标签: swift2 closures session-cookies nsurlsession nsmutableurlrequest

假设我已经登录了两个帐户并为每个帐户获取了唯一的会话cookie。

执行使用嵌套闭包的ViewController.run()时,会产生一系列80个唯一的URL请求(两个帐户各占40个)。

虽然我能够完成所有80个唯一的URL请求,但不知何故,一个帐户有时会请求只有其他帐户才能生成的URL。

我非常确定每个帐户之间的资源以及每个帐户的请求都是隔离的。 run()的两次执行构建了自己的Visit(_:)URLVisitor(_:)Request(_:)实例。

注意:假设帐户的用户名数组中都没有包含对方在其数组中的用户名。

ViewController.swift

func run(completion: () -> Void) {
    // 40 usernames appended to array
    var usernames: [String] = ["username1",..., username40]

    for username in usernames {
        let visit = Visit()
        visit.sessionCookie = sessionCookie
        visit.visitProfile(username) {
             NSThread.sleepForTimeInterval(5.0)
        }       
    }
}

Visit.swift

var contentsOfURL = NSString()
var sessionCookie = String()

func visitprofile(username: String, completion: () -> Void) {
    let url = "https://www.someurl.com/profile/\(username)"
    let encodedURL = url.stringByAddingPercentEncodingWithAllowedCharacters(
        NSCharacterSet.URLFragmentAllowedCharacterSet()),
    URL = NSURL(string: encodedURL!)    

    let vis = URLVisitor(URL: URL!)
    vis.sessionCookie = self.sessionCookie
    vis.execute {
        if vis.containsString(profileName) {
            print("\(profileName) visited: OK")
        } else {
            print("\(profileName) visited: FAIL")
        }
        completion()
    }
}

URLVisitor.swift

var contentsOfURL = NSString()
var sessionCookie = String()
var URL = NSURL()

init(URL: NSURL) {
    self.URL = URL
}

func execute(completion: () -> Void) {
    let request = Request()
    request.sessionCookie = self.sessionCookie
    request.accessToken = self.accessToken
    request.sessionCookie = self.sessionCookie

    request.sendRequest(self.URL, completion: () -> Void) {
        self.sessionCookie = request.sessionCookie
        self.contentsOfURL = request.contentsOfURL
        completion()
    }
}

Request.swift :NSObject,NSURLSessionDelegate

var contentsOfURL = NSString()
var responseCookies = String()
var sessionCookie = String()

func sendRequest(URL: NSURL, completion: () -> Void) {
    var request = NSMutableURLRequest(URL: URL)
    var session = NSURLSession.sharedSession()
    var config = NSURLSessionConfiguration.defaultSessionConfiguration()

    if sessionCookie != "" {
        config.HTTPCookieStorage = nil
        config.requestCachePolicy = .ReloadIgnoringLocalAndRemoteCacheData
        request.setValue(sessionCookie, forHTTPHeaderField: "Cookie")
        session = NSURLSession(configuration: config, delegate: self, delegateQueue: nil)
    }

    request.HTTPBody = params.dataUsingEncoding(NSUTF8StringEncoding)
    request.HTTPMethod = "GET"

    let task = session.dataTaskWithRequest(request) { (data, response, error) in
            let response = response as! NSHTTPURLResponse

            do {
                self.contentsOfURL = try NSString(contentsOfURL: URL, encoding: NSUTF8StringEncoding)
            } catch{

            }

            if self.sessionCookie == "" {        
                self.sessionCookie = // obtained here during login
            }
        completion() 
    }
    task.resume()
}

0 个答案:

没有答案