2016-12-12 3 views
0

Ich versuche, einen Hintergrund-Upload von Bildern und Videos in derselben Anfrage zu erstellen. Ich habe einen benutzerdefinierten Sessionmanager für Hintergrundaufgaben:Alamofire Abschluss, wenn App im Hintergrund

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

Und dann mache ich die Anfrage mit dem folgenden Code:

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) 
     } 
    } 
} 

Das Problem ist, dass die Fertigstellung des Antrags (*), wird nur aufgerufen, wenn App im Vordergrund ist. Es scheint, dass, wenn die App im Hintergrund läuft, alamofire weiterhin hochlädt (wegen URLSessionConfiguration.background), aber die Fertigstellung wird nur aufgerufen, wenn die App wieder in den Vordergrund tritt. Ich möchte eine UNNotification anzeigen, wenn der Upload abgeschlossen ist, während sich die App im Hintergrund befindet. Ist es möglich?

Antwort

0

Ist Ihre Klasse am Leben, wenn App im Hintergrund ist? Der Completion-Block wird nur ausgeführt, wenn die Klasse, in der sie geschrieben ist, im Speicher ist (möglicherweise enthält der Completion-Block ein schwaches Selbst).

+0

Der viewController mit der Abschlussverriegelung hat ein schwaches Selbst in der Erfassungsliste, aber dieser Ansichtscontroller wird nicht zerstört, wenn die App im Hintergrund läuft. Wenn App im Vordergrund zurückkehrt, wird die Beendigung aufgerufen und die Benachrichtigung erscheint. –

Verwandte Themen