【问题标题】:How to call API in background thread?如何在后台线程中调用 API?
【发布时间】:2016-06-28 10:52:35
【问题描述】:

我在我的应用程序中使用 Alamofire 进行 API 调用。

现在我想在后台线程中调用一些 API,以便在调用该 API 时,其他功能正常工作。那么如何在 Alamofire 中做到这一点呢?

这就是我调用 APi 的方式

func GetDesignationList(pharmacyId : String,completion:(ManageDesignation : ManageDesignationListModel)-> Void)  {
let url = "\(VendorURL)all_employee_designation_list"
let param : [String : AnyObject] = [

    "pharmacyId" : pharmacyId
]

Alamofire.request(.GET, url, parameters: param, encoding: .URL).responseObject { (response:Response<ManageDesignationListModel, NSError>) in
    switch response.result
    {
    case.Success(let value) :
        var ManageDesignationObject : ManageDesignationListModel?
        ManageDesignationObject = value
        completion(ManageDesignation: ManageDesignationObject!)
    case.Failure(let error) : break

    }
}

}

【问题讨论】:

  • 你可以使用 dispatch_queues。
  • Alamofire 本身将在后台线程中完成它的工作,这样您就不必在那里投入精力。在完成 alamofire 块时您想要执行的任何其他功能,您可以正常执行。如果您希望尽快获得 alamofire 结果,您将遇到问题,因为它是一个 Asynchronous 进程,并且不会真正等待任何其他工作先完成。
  • ok @Dershowitz123 Alamofire 在后台线程中完成所有工作??
  • 是的!这是一个Asynchronous 进程,它在后台线程上执行它的工作,确保您的 UI 不会冻结或减慢您的应用程序的整体速度。

标签: ios objective-c swift ios9 alamofire


【解决方案1】:

你已经做对了。 Alamofire 在后台线程中调用 Web 服务。如果你想测试它是否异步工作,你可以在调用之后添加一个print("1"),并在response闭包内添加一个print("2")

【讨论】:

    【解决方案2】:

    正如所指出的,Alamofire 已经为您完成了这项工作。

    但是要回答“如何在后台线程中调用API”的问题

    可以分派到不同线程的类:

    class Dispatcher
    {
        enum DispatchLevel
        {
            case Main, UserInteractive, UserInitiated, Utility, Background
            var dispatchQueue: OS_dispatch_queue {
                switch self {
                case .Main:             return dispatch_get_main_queue()
                case .UserInteractive:  return dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0)
                case .UserInitiated:    return dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)
                case .Utility:          return dispatch_get_global_queue(QOS_CLASS_UTILITY, 0)
                case .Background:       return dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0) }
            }
        }
    
        func delay(bySeconds seconds: Double, dispatchLevel: DispatchLevel = .Main, closure: () -> Void)
        {
            let time = dispatch_time(DISPATCH_TIME_NOW, Int64(seconds * Double(NSEC_PER_SEC)))
            dispatch_after(time, dispatchLevel.dispatchQueue, closure)
        }   
    }
    

    像这样使用它:

    let myDispatch = Dispatcher()
    
    myDispatch.delay(bySeconds: 10, dispatchLevel: .Background)
    {
        print("Do something here on background thread")
    }
    

    【讨论】:

      【解决方案3】:

      同时调用 Web 服务和 UI

      dispatch_queue_t downloadQueue = dispatch_queue_create("webservice", NULL);
      dispatch_async(downloadQueue, ^{
      
      
              // do our long running process here
              [NSThread sleepForTimeInterval:10];
      
      
              // do any UI stuff on the main UI thread
              dispatch_async(dispatch_get_main_queue(), ^{
      
              });
      
      
          });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-25
        • 2017-12-24
        • 1970-01-01
        • 2018-06-11
        • 2014-02-26
        相关资源
        最近更新 更多