2017-05-21 8 views
7

'Swift' uygulamasında, Amazon S3 kovuğuma fotoğraf yükleme özelliğim var. Kullanıcı WiFi veya LTE'a bağlandığında, sorun yoktur, ancak bağlantı biraz daha yavaş olduğunda (örn. 3G), yükleme çok fazla zaman alır (bir dakikaya kadar) ve iphone 15-20% kaybedebilir pil! Fotoğrafları 200-300kb'ye düşürüyorum, bu yüzden sorun olmamalı. Bunun için kullandığınız koddur: bu büyük pil tüketimi önlenebilir senin burada yanlış yapıyorum ne zihin ve nasıl çıkageldi şeySwift uygulamamdaki verileri Amazon S3'e yüklüyorum ve pili başka hiçbir şey gibi boşaltıyor. Bu nasıl önlenebilir?

func awsS3PhotoUploader(_ ext: String, pathToFile: String, contentType: String, automaticUpload: Bool){ 

     let credentialsProvider = AWSCognitoCredentialsProvider(regionType:CognitoRegionType, 
                   identityPoolId:CognitoIdentityPoolId) 
     let configuration = AWSServiceConfiguration(region:CognitoRegionType, credentialsProvider:credentialsProvider) 
     AWSServiceManager.default().defaultServiceConfiguration = configuration 

     let uploadRequest = AWSS3TransferManagerUploadRequest() 
     uploadRequest?.body = URL(string: "file://"+pathToFile) 
     uploadRequest?.key = ProcessInfo.processInfo.globallyUniqueString + "." + ext 
     uploadRequest?.bucket = S3BucketName 
     uploadRequest?.contentType = contentType + ext 

     uploadRequest?.uploadProgress = { (bytesSent, totalBytesSent, totalBytesExpectedToSend) -> Void in 
      DispatchQueue.main.async(execute: {() -> Void in 
       if totalBytesExpectedToSend > 1 { 
        print(totalBytesSent) 
        print(totalBytesExpectedToSend) 
       } 
      }) 
     } 
     let transferManager = AWSS3TransferManager.default() 
     transferManager?.upload(uploadRequest).continue({ (task) -> AnyObject! in 

      if (task.isCompleted) { 
        print("task completed") 
      } 

      if let error = task.error { 
       print("Upload failed ❌ (\(error))") 

      } 
      if let exception = task.exception { 
       print("Upload failed ❌ (\(exception))") 

      } 
      if task.result != nil { 
       let s3URL: String = "https://myAlias.cloudfront.net/\((uploadRequest?.key!)!)" 
       print("Uploaded to:\n\(s3URL)") 
      } 
      else { 
       print("Unexpected empty result.") 
      } 
      return nil 
     } 
     ) 

} 

var mı?

+0

. UploadProgress geri aramanız ne sıklıkla çağrılır? Daha yavaş yüklemeler için daha sık olacak sanırım. Bu nedenle, DispatchQueue.main üzerinde çok sayıda çağrı planlıyor olabilirsiniz. Hangi kaynakları alabiliyor ve bu da ilerlemeyi yavaşlatıyor, bu da konuyu daha da kötüleştiriyor. Aslında, bizim app çok meşgul olduğu yeniden-çizim olarak birkaç kez önce bir "güzel ve fantezi" bir ilerleme animasyon, sadece birkaç kez ağ hızı damla görmek için eklediğimiz gibi (farklı ama benzer bir senaryoda) gibi bir sorun gördüm ilerleme ve gerçek ağ için zaman yoktu :-). – Seva

+0

Uygulamanızın cihazlarda Zaman Profiler'i kullanarak çoğu CPU'yu nerede harcadığını gerçekten tahmin edebileceğinizden daha kolay. Nasıl yapılacağını açıklayan bir [WWDC videosu] (https://developer.apple.com/videos/play/wwdc2016/418/) var. –

cevap

5

aşağıdaki cevabı Senden tek Radyo Ağı Tipi tespit etme yeteneği olan ne gerek inanılan https://stackoverflow.com/a/20690088/3549695

esinlenmiş. WiFi, LTE, 3G, 2G veya No Network olsun. Sonra uygulamanın sonuca göre, karar vermesi gerekecektir.

Bu konsepti iPhone'umda test etmek için bir Xcode projesi oluşturdum. 6 Çalışıyor gibi görünüyor, ancak yalnızca 'Air Plane Mode', WiFi ve LTE'yi test edebiliyordum. Kendimi 2G veya 3G ağına alamıyorum.

WiFi veya LTE ya durumda, değeri elde edecek: 'CTRadioAccessTechnologyLTE'

'Uçakları Modunda', İsteğe Bağlı değeri sıfır olacak olsa

. Öyleyse benim için değiştirdiğim metin kalmadı. Ve

İşte

benim ViewController.swift neye benzediği 'tespit edebilmektedir Değil' çıkışına seç:

import UIKit 
import CoreTelephony 

class ViewController: UIViewController { 

    @IBOutlet weak var currentRAN: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

    } 

    @IBAction func detect(_ sender: UIButton) { 
     if case let telephonyInfo = CTTelephonyNetworkInfo(), 
      let currentRadioAccessTech = telephonyInfo.currentRadioAccessTechnology { 

      currentRAN.text = currentRadioAccessTech 
      print("Current Radio Access Technology: \(currentRadioAccessTech)") 

     } else { 
      currentRAN.text = "Not able to detect" 
      print("Not able to detect") 
     } 
    } 
} 

.currentRadioAccessTechnology için olası değerler şunlardır Nerede: Sadece tahmin

/* 
* Radio Access Technology values 
*/ 
@available(iOS 7.0, *) 
public let CTRadioAccessTechnologyGPRS: String 
@available(iOS 7.0, *) 
public let CTRadioAccessTechnologyEdge: String 
@available(iOS 7.0, *) 
public let CTRadioAccessTechnologyWCDMA: String 
@available(iOS 7.0, *) 
public let CTRadioAccessTechnologyHSDPA: String 
@available(iOS 7.0, *) 
public let CTRadioAccessTechnologyHSUPA: String 
@available(iOS 7.0, *) 
public let CTRadioAccessTechnologyCDMA1x: String 
@available(iOS 7.0, *) 
public let CTRadioAccessTechnologyCDMAEVDORev0: String 
@available(iOS 7.0, *) 
public let CTRadioAccessTechnologyCDMAEVDORevA: String 
@available(iOS 7.0, *) 
public let CTRadioAccessTechnologyCDMAEVDORevB: String 
@available(iOS 7.0, *) 
public let CTRadioAccessTechnologyeHRPD: String 
@available(iOS 7.0, *) 
public let CTRadioAccessTechnologyLTE: String 
+0

Bu cevabı kabul edemezseniz, lütfen bize nedenini bildirin. Herkesin bundan yararlanması için yararı var. – Wismin

İlgili konular