Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 后台进程侦听变量更改?_Ios_Swift_Background Process_Nsoperationqueue - Fatal编程技术网

Ios 后台进程侦听变量更改?

Ios 后台进程侦听变量更改?,ios,swift,background-process,nsoperationqueue,Ios,Swift,Background Process,Nsoperationqueue,我不熟悉iOS的后台操作,所以我想知道解决此类问题的最佳方法是什么: 我有数据,来自一个webservice#1,需要在后台解析并发送到webservice#2 我需要一个后台线程,它将监听存储来自webserivce#1的数据的数组中的更改,当它不为空时,线程将启动uploadOperation,该操作将处理数组并将处理后的数据发送到webservice#2 从字面上看,我是怎么看的: 我有一个由Singleton sharedInstance提供的DataManager类 let share

我不熟悉iOS的后台操作,所以我想知道解决此类问题的最佳方法是什么:

我有数据,来自一个webservice#1,需要在后台解析并发送到webservice#2

我需要一个后台线程,它将监听存储来自webserivce#1的数据的数组中的更改,当它不为空时,线程将启动uploadOperation,该操作将处理数组并将处理后的数据发送到webservice#2

从字面上看,我是怎么看的: 我有一个由Singleton sharedInstance提供的DataManager

let sharedInstance = DataManager()
它有

public var data: [String]? {
    didSet {
        processData()
    }   
}

private var uploadToWebSerivice2Queue: NSOperationQueue?

private override init() {
    uploadToWebSerivice2Queue = NSOperationQueue()
    uploadToWebSerivice2Queue.maxConcurentOperations = 1
    getCachedAndNotSentDataFromDatabase()
}

private func getCachedAndNotSentDataFromDatabase() {
    data = ("string 1", "string 2", "string 3", "string 4")
}

private func processData() {

    while let lastElement = data!.removeLast {
        let processedData = process(lastElement)
        let uploadOperation = UploadOperation(processedData) // Data upload opeation
        uploadToWebSerivice2Queue!.addOperation(uploadOperation)
    }

}
如果在最后一次尝试期间无法将某些数据发送到webservice#2,则这些数据可能来自缓存它们的数据库。有些数据可能来自运行时的webservice#1

因此,在另一个类中,我们称之为Webservice1DataHandler,我会:

DataManager.sharedInstance.data.append("New string to process and upload to webservice#1")
总之,, vardata将在first init()之后设置,uploadQueue将开始处理该数据。然后,新字符串将附加到vardata,这意味着将调用processData()方法,并可能出现数据数组访问的并发问题


我不确定我的算法是否正确。

为什么要费心处理数据数组?为什么不简单地调用一个将另一个上载操作放到队列上的方法呢。通过使用阵列,在更新阵列时可能会出现并发问题。所以你只需要说
DataManager.sharedInstance.processData(somedata)
这正是我所知道的。为新到达的数据的每个部分调用processData并没有出现在我的脑海中。谢谢。@Paulw11,但是,如果我需要先处理新到达的数据,这可能会成为一个问题。在这种情况下,我可以使用数据数组作为堆栈(LIFO)。是的,但您需要确保对数组的访问是线程安全的-@Paulw11我喜欢这种方法,再次感谢。为什么要使用数据数组呢?为什么不简单地调用一个将另一个上载操作放到队列上的方法呢。通过使用阵列,在更新阵列时可能会出现并发问题。所以你只需要说
DataManager.sharedInstance.processData(somedata)
这正是我所知道的。为新到达的数据的每个部分调用processData并没有出现在我的脑海中。谢谢。@Paulw11,但是,如果我需要先处理新到达的数据,这可能会成为一个问题。在这种情况下,我可以使用数据数组作为堆栈(LIFO)。是的,但您需要确保对数组的访问是线程安全的-@Paulw11我喜欢这种方法,再次感谢。