这可能是一个愚蠢的问题,但我在更改代码时遇到了一些问题,以避免在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之前完成。
您对如何正确执行此操作有任何建议吗?
感谢任何帮助!
此致 埃里克
答案 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")
}
}];
}
换句话说,当一个请求完成时(在完成处理程序块中),开始下一个请求。重复直到完成。但是这样做是使用来自回调块的方法调用,而不是循环和同步请求。