2017-05-21 4 views
7

मेरे 'स्विफ्ट' ऐप में मेरे पास Amazon S3 बाल्टी में फ़ोटो अपलोड करने की सुविधा है। जब उपयोगकर्ता WiFi या LTE से कनेक्ट होता है, तो कोई समस्या नहीं है, लेकिन जब कनेक्शन थोड़ा धीमा होता है (उदाहरण के लिए 3G), तो अपलोड में बहुत समय लगता है (एक मिनट तक) और आईफोन 15-20% खो सकता है बैटरी! मैं लगभग 200-300 केबी तक फोटो का आकार बदलता हूं, इसलिए यह कोई समस्या नहीं होनी चाहिए। कोड है कि मैं उस के लिए उपयोग करते हैं:मैं अपने स्विफ्ट ऐप से अमेज़ॅन एस 3 में डेटा अपलोड कर रहा हूं और यह बैटरी को और कुछ नहीं छोड़ता है। इससे कैसे बचा जा सकता है?

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

} 

कुछ ऐसा है जिसे मैं गलत यहाँ क्या कर रहा हूँ की अपने मन और कैसे करने के लिए आता है इस विशाल बैटरी की खपत से बचा जा सकता है?

+0

बस अनुमान लगा। आपके अपलोड प्रोग्रेस कॉल को कितनी बार कॉल किया जाता है? मुझे लगता है कि धीमे अपलोड के लिए यह अधिक बार होगा। तो, आप DispatchQueue.main पर बहुत सी कॉल शेड्यूल कर सकते हैं। जो संसाधन उठा सकता है और बदले में प्रगति को धीमा कर सकता है, इस मुद्दे को और बढ़ा सकता है। असल में, मैंने कई साल पहले (एक अलग, लेकिन समान परिदृश्य में) इस तरह की एक समस्या देखी थी जब हमने "अच्छी और फैंसी" प्रगति एनीमेशन जोड़ा, केवल नेटवर्क की गति को कई बार देखने के लिए, क्योंकि हमारा ऐप फिर से चित्रित करने में व्यस्त था प्रगति और वास्तविक नेटवर्किंग के लिए कोई समय नहीं था :-)। – Seva

+0

अनुमान लगाने की कोशिश करने से आसान आप वास्तव में माप सकते हैं कि आपका ऐप इंस्ट्रूमेंट्स में टाइम प्रोफाइलर का उपयोग करके अधिकतर CPU का विस्तार कर रहा है। एक [डब्ल्यूडब्ल्यूडीसी वीडियो] है (https://developer.apple.com/videos/play/wwdc2016/418/) यह बताते हुए कि यह कैसे करें। –

उत्तर

5

निम्नलिखित जवाब द्वारा https://stackoverflow.com/a/20690088/3549695

मैं मानना ​​था आपको बस इतना करना रेडियो नेटवर्क के प्रकार पता लगाने की क्षमता की जरूरत है क्या कर रहा है प्रेरित था। यह वाईफाई, एलटीई, 3 जी, 2 जी, या कोई नेटवर्क हो। फिर ऐप को परिणाम के आधार पर निर्णय लेने की आवश्यकता होगी।

मैंने अपने आईफोन 6 पर इस अवधारणा का परीक्षण करने के लिए एक परीक्षण एक्सकोड प्रोजेक्ट बनाया है। ऐसा लगता है, लेकिन मैं केवल 'एयर प्लेन मोड', वाईफाई और एलटीई का परीक्षण कर सकता हूं। मैं खुद को 2 जी या 3 जी नेटवर्क में नहीं ले सकता।

या तो Wi-Fi या एलटीई के मामले में, मैं मूल्य प्राप्त होगा: 'CTRadioAccessTechnologyLTE'

'एयर विमान मोड' में, वैकल्पिक मूल्य नहीं के बराबर हो जाएगा है। तो यह मेरे ऊपर है कि मैं इसे किस पाठ से बदलता हूं। और मैं

यहाँ मेरी ViewController.swift कैसा दिखता है 'पता लगाने में सक्षम नहीं' उत्पादन करने के लिए चुन:

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 के लिए संभावित मान हैं:

/* 
* 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

यदि आप इस उत्तर को स्वीकार नहीं कर सकते हैं, तो कृपया हमें कारण बताएं। यह सीखने के लिए हर किसी के लाभ के लिए है। – Wismin

संबंधित मुद्दे