如何在swift中正确读取外设值?

如何在swift中正确读取外设值?

问题描述:

我想从我的一个视图控制器读取一个字节数组到另一个,请在下面找到我的代码。如何在swift中正确读取外设值?

从我的第一个视图

class First: UIViewController { 

var myByteArray = [UInt8](repeating:0, count: 20) 

viewDidLoad(){ 
......} 

几条语句后她在那里我在一个函数读我的数据

func passThis(){ 

let ReceiveData = rxCharacteristic?.value 
     if let ReceiveData = ReceiveData { 
      let ReceivedNoOfBytes = ReceiveData.count 
      myByteArray = [UInt8](repeating: 0, count: ReceivedNoOfBytes) 
      (ReceiveData as NSData).getBytes(&myByteArray, length: ReceivedNoOfBytes) 
      print("Data Received ",myByteArray) 
       } 

这是我的,我试图来读取首先我阵列的第二视图查看

class Second: UIViewController { 

var myByteArray2 = [UInt8](repeating: 0, count: 20) 

viewDidLoad(){ 
super.viewDidLoad() 
let fvc = First() 
myByteArray2 = fvc.myByteArray 

print(myByteArray2) 
} 

现在我有[11,12,13,14,15,16,17,18,19,20]从myByteArray 但myByteArray2中有[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]?

有人可以帮忙吗?

另外,如何在写入和读取新值之前清除rxCharacterstic中的readValue缓冲区?

任何帮助/意见表示赞赏。

感谢

编辑 - >我的传球是如何做

从BLECentral

class BLECentral: ... 

var centralManager: CBCentralManager! 

//After Scanning and connecting 

func centralManager(_central: CBCentralManager, didConnect peripheral: CBPeripheral){ 

peripheral.delegate = self 

peripheral.discoverServices([BLEUUID]) 



//Once connected, move to new view controller to manager incoming and outgoing data 
     let storyboard = UIStoryboard(name: "Main", bundle: nil) 

     let firstVC = storyboard.instantiateViewController(withIdentifier: "First") as! First 

     firstVC.peripheral = peripheral 

     navigationController?.pushViewController(firstVC, animated: true) 
    } 

现在在我的第一个下准备赛格瑞块我传递周围像这样

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
if segue.destination is Second 
{ 
let vc2 = segue.destination as? Second 
vc2.periperal = blePeripheral 
} 
} 
+0

你是如何转换视图控制器?首先呼叫第二? – Diesel

+0

@柴油嗨柴油,非常感谢,我能够解决它与您的答案一点点阅读:) – nar0909

+0

没问题。你在做什么是正确的!我建议阅读Apple教程(只需阅读它),因为它可以节省您的时间并涵盖基本知识。 https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/是一个很好的开始或免费的书籍,如果你有更多的时间在名为“应用程序开发与斯威夫特”的书店。 – Diesel

您正在从哟创建新的First视图控制器而不是访问已经创建的视图控制器。

//Create a new View Controller 
let fvc = First() 

所以你有两个First现在是。你想要做的是访问已经创建的First视图控制器。假设没有其他办法,你想拥有一个“Singleton”。这是一个非常糟糕的方式来处理这个问题,稍后我会解释,而且很可能有更好的方法,但是如果他们从不沟通,我会给出一个解决方案来访问First from Second,但First已经创建。

如果您在First声明像一块代码:

static let shared = First() 

那么这个单可以通过

let first = First.shared 

如此说来访问,这就是视图之间处理通信一个非常糟糕的方式控制器。如果您从First调用Second,则应将数据从First移到Second(或者您可以传递First to Second的引用,以便Second可以访问First)。

有您导航前通过在

func prepare(for segue: UIStoryboardSegue, sender: Any?) 

方法视图控制器之间的数据普遍好方法。无论什么时候,使第二个视图控制器应该传递它所需要的数据。

最后,Singleton视图控制器是一个糟糕的想法的另一个原因是它远离了MVC概念。因此,如果您无法将正确的数据传递给第二个,那么您可能需要一个新的类来处理您的数据,First和Second都可以使用MVC中的Model。

+0

嗨感谢您的回复,https://stackoverflow.com/questions/47824265/how-to-modify-an-existing-blecentral-class-into-a-singleton-class这正是我所拥有的,所以你可以现在就帮助我解决它是如何完成的?我不希望它是单身人士,我可以在一个视图控制器中读写,我只想将相同的功能传递给我的其他视图?任何帮助赞赏。 – nar0909

+0

请检查我的编辑,了解如何通过外设。很多谢谢 – nar0909

+0

我很高兴你解决了这个问题。意识到,如果你有很多数据,你可以创建一个全新的类来处理这些数据。例如,我有一个包含多个食物的应用程序。我的课外出,下载地点,存储它们,并具有getPlace或getAllPlaces或refreshPlaces等功能。这也是一个单身人士,所以每个人都可以进入这些地方。这样我就不必每次都需要下载数据。这里是一个相当不错的阅读MVC:https://www.raywenderlich.com/132662/mvc-in-ios-a-modern-approach – Diesel