HTTP相关心得

iOS(swift)用Alamofire时,注意返回response时所处的线程

iOS(swift)对于http库,Alamofire的响应返回默认处于主的UI线程

-> 而很多耗时的操作,是不建议,不允许,在主线程中操作的

-> 所以我后来自己在Alamofire基础上封装的库,是用dispatchBackground_asyncresponseJSON返回后运行在后台线程

-> 避免大量的操作堵塞了UI的响应

-> 又由于iOS中只能在主线程UI线程中操作UI元素

-> 所以此时如果直接在Alamofire返回的地方去操作UI元素则会报错:Terminating app due to uncaught exception NSInternalInconsistencyException reason Only run on the main threadUI API called from background thread xx must be used from main thread only

解决办法是:

对于每个Alamofire的返回的response时,自己根据需要,加上异步主线程,在其中处理UI操作的部分。

示例代码:

    func getUnreadCount(){
        let url = ServerApi.getUnreadCountUrl()

        getUrlRespJson_async(
            httpMethod: .get,
            url: url,
            parameters: nil,
            respJsonHandle: { (response) in
                if response.isSuccess {
                    if let count = response.successValue["count"].int {
                        gLog.debug("count:\(count)")
                        dispatchMain_async ({
                            if count <= 0{
                                self.tabBarItem.badgeValue = nil
                            } else if count >= 100 {
                                self.tabBarItem.badgeValue = "99+"
                            } else {
                                self.tabBarItem.badgeValue = "\(count)"
                            }
                        })
                    }
                } else if response.isFailure {
                    dispatchMain_async ({
                        self.noticeInfo(response.failedMessage)
                    })
                }
        })
    }

respJsonHandle中当isSuccess时,用dispatchMain_async确保处于主线程,然后才能去操作UI中的元素:self.tabBarItem.badgeValue

而对于上述函数详见:

相关帖子可参考:

[已解决]swift中Alamofire的request的responseJSON不执行不返回了

断点续传就是利用Http的Range实现的

对于断点续传功能的实现,就是利用了HTTP的头Range去实现的:

详见:

[已解决]swift 下载时支持断点续传

results matching ""

    No results matching ""