2016-12-12 49 views
0

我试图在同一请求中创建图像和视频的后台上传。我创建了后台任务自定义SessionManager:Alamofire在后台完成应用程序

let configuration = URLSessionConfiguration.background(withIdentifier: "by.wink.citynews.upload.background") 
configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders 
let sessionManager = Alamofire.SessionManager(configuration: configuration) 

然后我就与下面的代码请求:

func uploadNews(newsCreating: NewsCreating, progressHandler: @escaping (Double)->Void, completion: @escaping NewsCreatingCallback) { 
    let parameters: [String: String] = ["text" : newsCreating.text, "category" : newsCreating.category.id] 

    backgroundManager.upload(multipartFormData: { multipartFormData in 
     for (key, value) in parameters { 
      multipartFormData.append(value.data(using: .utf8)!, withName: key) 
     } 
     newsCreating.images.forEach({ image in multipartFormData.append(image.jpegCompressedData, withName: "images[]", fileName: "\(image.name).jpg", mimeType: "image/jpeg") }) 
     if let video = newsCreating.video { 
      multipartFormData.append(video.url, withName: "video", fileName: "\(video.name).mp4", mimeType: "video/mp4") 
     } 
    }, to: URL(string: "http://api.someapi.com/endpoint")!, method: .post) { encodingResult in 
     switch encodingResult { 
     case .success(let uploadRequest , _, _): 

      // custom response for auto-parsing of json 
      uploadRequest.responseServiceObject { (response: DataResponse<ServiceResult<NewsReporting, NewsCreatingServiceError>>) in 

       // (*) alamofire completion, here is the problem. 
       switch(response.result) { 
       case .success(let serviceResult): 
        if serviceResult.success { 
         completion(.success(serviceResult.response)) 
        } else { 
         completion(.clientError(serviceResult.errors)) 
        } 
       case .failure(let error): 
        completion(.error(error as! CityNewsError)) 
       } 

       uploadRequest.uploadProgress() { requestProgressHandler in 
        progressHandler(requestProgressHandler.fractionCompleted) 
       } 
      } 
     case .failure(let error): 
      print(error) 
     } 
    } 
} 

的问题是,请求(*)的完成,只调用当应用程序在前台。似乎应用程序在后台运行时,alamofire仍然继续上传(因为URLSessionConfiguration.background),但只有当应用程序再次进入前台时才会调用完成。如果应用在后台上传完成,我想显示UNNotification。可能吗?

回答

0

当应用程序处于后台时,您的类是否还活着?完成块仅在写入内存的类位于内存时执行(可能是完成块包含弱自我)。

+0

具有完成闭包的viewController在捕获列表中具有弱自我,但是当应用程序进入后台时,此视图控制器不会被销毁。 Morover,当应用程序在前台返回时,调用完成并显示通知。 –

相关问题