不推荐使用sendSynchronousRequest。如何使用dataTaskWithRequest实现相同的功能?

时间:2016-02-04 11:56:49

标签: ios swift deprecated nsurlsession nsurlrequest

这可能是一个愚蠢的问题,但我在更改代码时遇到了一些问题,以避免在iOS9中使用一些已弃用的代码。

我创建了一个登录网页的应用。该网页使用用户名和密码转发到必须输入令牌的页面。

我已经能够通过使用在for循环中同步加载的三个URL来登录该网页。 以下是该过程的一个简单示例:

let urls = ["www.testpage.com", "www.testpage.com/username=erik&password=123", "www.testpage.com/token=123456"]

for (index, url) in urls.enumerate() {

     self.urlRequest = NSMutableURLRequest(URL: urlObject.baseUrl, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 30.0)

     NSURLConnection.sendSynchronousRequest(self.urlRequest, returningResponse: &response)

     if index == 2 {
          print("Login successful")
     }
}

由于同步请求一次以正确的顺序触发了url,因此效果很好。

我现在无法使用dataTaskWithRequest实现相同的功能,因为最后一个url有时会在第一个url之前完成。

您对如何正确执行此操作有任何建议吗?

感谢任何帮助!

此致 埃里克

1 个答案:

答案 0 :(得分:-1)

不要那样做。相反,做这样的事情:

let index: UInt = 0

self.beginRequest(index, urls);

然后写一个Swift版本:

- (void) beginRequestAtIndex: (NSUInteger) index inArray:(NSArray *)URLs {
    NSURL *URL = URLs[index];
    NSURLRequest *req = [NSURLRequest requestWithURL:URL];
    // Configure request here.

    NSURLSession *session = self.myURLSession;

    NSURLSessionDataTask *task = [session dataTaskWithRequest:req
                                            completionHandler:^(NSData *data,
                                                    NSURLResponse *response,
                                                    NSError *error))completionHandler {

        if (++index >= [URLs count]) {
          print("Login successful")
        } else {
          dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)),
                         dispatch_get_main_queue(), ^{
              [self beginRequestAtIndex:index inArray: URLs];
          });

          print("Login successful")
        }
    }];

}

换句话说,当一个请求完成时(在完成处理程序块中),开始下一个请求。重复直到完成。但是这样做是使用来自回调块的方法调用,而不是循环和同步请求。