ios - 如何实现 iOS 后台获取?

标签 ios objective-c swift fetch

我是 Swift 的新手。我正在制作一个发送多个 HTTP 请求并接收响应的应用。

我看了Swift后台教程,然后在模拟器上试了试没有反应。

我还通过 alamofire 发送 HTTP 请求,我认为这没有问题,因为 alamofire 使用 NSURL

所以我认为我的 appdelegate 有一些不足。您能协助确定它不起作用的原因吗?

这是我的应用委托(delegate)代码的一部分以供引用:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UIApplication.sharedApplication().setMinimumBackgroundFetchInterval(
        UIApplicationBackgroundFetchIntervalMinimum)

    return true
}

func application(application: UIApplication, completionHandler: (UIBackgroundFetchResult) -> Void) {

    if let AddressViewController = window?.rootViewController as? AddressViewController {
        AddressViewController.fetchAndUpdate() {
            completionHandler(.NewData)
        }
    } else {
        completionHandler(.Failed)
    }
}

func fetchAndUpdate(completionHandler: (() -> Void)!) {

    AddressList.map({ (oneLineAddress) in
        dataController.fetchTags(oneLineAddress) { (error, newPocket) in
            self.dataController.updateData(oneLineAddress, newPocket: newPocket)
        }
    })
}

func fetchTags(address:OneLineAddress, completionHandler: (NSError?, newPocket:Set<String>) -> Void) {

    var newPocket:Set<String> = []

    guard let targetAddress:OneLineAddress = address else {
        return
    }
    Alamofire.request(.GET, targetAddress.url).responseString {
        responseString in
            guard responseString.result.error == nil else {
                completionHandler(responseString.result.error!, newPocket: [])
                NSLog("%@", responseString.result.error!)
                return
            }
            guard let htmlAsString = responseString.result.value else {
                let error = Error.errorWithCode(.StringSerializationFailed, failureReason: "Could not get HTML as String")
                NSLog("%@", error)
                completionHandler(error, newPocket: [])
                return
            }

            let doc = HTMLDocument(string: htmlAsString)

            let anchors = doc.nodesMatchingSelector("a")

            for row in anchors {
                if let anchorElement = row as? HTMLElement {
                    if self.isAnchor(anchorElement) {
                        if  let title = self.matchKeyword(anchorElement, address: targetAddress) {
                            newPocket.insert(title)
                        }
                    }
                }
            }
            completionHandler(nil, newPocket: newPocket)
    }
}

最佳答案

通过 swift 请求和响应。您可以使用 AFNetwork 或自己制作。

NSURLConnection,这个类可以帮助你

关于ios - 如何实现 iOS 后台获取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35534353/

相关文章:

ios - 从 Firebase 存储中提取图像时,图像不会加载,直到我通过滚动与 tableView 交互... SWIFT 3

iphone - xcode 4.5.1 Shell脚本调用错误

ios - 无法在 cocos2d-x v3 上进行多点触控

objective-c - Objective-C 类别和扩展的细节

ios - fatal error : unexpectedly found nil while unwrapping an Optional value (lldb)

ios - 错误 : use of unresolved identifier for NSDocumentDirectory, NSUserDomainMask,

iphone - 给定文件和目录生成相对路径的 Objective-C 代码

objective-c - 如何在 Mac OS X 中获取带有显示 ID 的显示名称?

swift - 如何将结构体初始化中的属性设置移动到另一个方法中

两个 Controller 之间的 iOS 对象或委托(delegate)?