我不知道如何处理这种情况,因为我是iOS开发和Swift的新手.我正在执行数据提取,如下所示:
func application(application: UIApplication!, performFetchWithCompletionHandler completionHandler: ((UIBackgroundFetchResult) -> Void)!)
{
loadShows()
completionHandler(UIBackgroundFetchResult.NewData)
println("Background Fetch Complete")
}
Run Code Online (Sandbox Code Playgroud)
我的loadShows()函数解析从加载到UIWebView的网站获得的一堆数据.问题是我有一个在loadShows函数中等待10秒左右的计时器.这允许在我开始解析数据之前完全加载页面中的javascript.我的问题是完成处理程序在我的loadShows()之前完成.
我想要做的是为"isCompletedParsingShows"添加一个bool,并使completionHandler行等待完成,直到该bool为真.处理这个问题的最佳方法是什么?
关于这一点有很多讨论,我理解使用委托方法并检查响应"404"的解决方案:
var request : NSURLRequest = NSURLRequest(URL: url)
var connection : NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)!
connection.start()
func connection(didReceiveResponse: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {
//...
}
Run Code Online (Sandbox Code Playgroud)
但我想有一个简单的解决方案,如:
var exists:Bool=fileexists(sURL);
Run Code Online (Sandbox Code Playgroud)
因为我会在代理的同一个类中有很多请求,我只想用我的函数fileexists()来检查响应.
任何提示?
更新 我想我将不得不做如下的同步请求,但我总是得到0x0000000000000000作为响应::
let urlPath: String = sURL;
var url: NSURL = NSURL(string: urlPath)!
var request1: NSURLRequest = NSURLRequest(URL: url)
var response: AutoreleasingUnsafeMutablePointer<NSURLResponse?
>=nil
var error: NSErrorPointer = nil
var dataVal: NSData = NSURLConnection.sendSynchronousRequest(request1, returningResponse: response, error:nil)!
var err: NSError
println(response)
Run Code Online (Sandbox Code Playgroud) 如
NSURLConnection sendSynchronousRequest:returningResponse:error:&connectionError
Run Code Online (Sandbox Code Playgroud)
设置已弃用我将不得不替换我很久以前写过的导入器.
进口商执行以下操作:
我使用后台操作实现了这个,我使用每个API的方法,如果请求有多个页面,则递归调用.
但是由于NSURLSession不支持同步请求,我目前只看到有很多开销的选项(例如iVars)控制在完成块中调用的内容(例如,下一页或开始查询API-B).
那么,将这个带到NSURLSession会是一个优雅的解决方案.
注意:只是为了确保,我以前的解决方案根本不会阻止主线程.但那时候它是控制两个来源合并的最简单方法.