我开始学习 iOS 的编程,我想了解如何在 Swift中使用线程实现下一个 Java 函数,以及 Objective-C (在我的应用中我也有一些使用这种语言的代码)
Java线程(用于Android应用)
1)等待两个或多个线程完成
final CountDownLatch latch = new CountDownLatch(2);
// start thread #1
new Thread(new Runnable() {
@Override
public void run() {
// do some work
latch.countDown();
}
}).start();
// start thread #2
new Thread(new Runnable() {
@Override
public void run() {
// do some work
latch.countDown();
}
}).start();
// wait for 2 threads to end (finish)
try {
latch.await();
} catch (InterruptedException e) {
//
}
// two threads are finished
// do other work
2)只有当前一个线程在此时完成或任何线程尚未启动时才开始新线程(mThread == null
)
private Thread mThread = null; // class field
// check if thread has completed execution
if ((mThread != null && mThread.getState() == Thread.State.TERMINATED)
|| mThread == null) {
mThread = new Thread(new Runnable() {
@Override
public void run() {
// do some work
}
});
mThread.start();
}
答案 0 :(得分:1)
对于2
,我会使用串行队列:
dispatch_queue_t myQueue;
按照以下方式实施我的队列:
myQueue = dispatch_queue_create("my_serial_queue", DISPATCH_QUEUE_SERIAL);
dispatch_async(myQueue, ^{
for (int i = 0; i < 10000; i++) {
usleep(100);
}
NSLog(@"Task 1 done");
});
dispatch_async(myQueue, ^{
NSLog(@"Task 2 done");
});
答案 1 :(得分:0)
我对第一个解决方案的回答(等到所有线程完成执行):
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
// block1
NSLog(@"Task Block1");
[NSThread sleepForTimeInterval:6.0];
NSLog(@"Task Block1 End");
});
dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
// block2
NSLog(@"Task Block2");
[NSThread sleepForTimeInterval:5.0];
NSLog(@"Task Block2 End");
});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER); // blocks current thread
对于第二种解决方案(2)
我找不到像isRunning
这样的GCD方法,所以我只使用布尔变量
在启动异步任务集变量isRunning为true之前 ... ... 当异步任务完成时,我们可以使用下一个回调:
dispatch_group_notify(_signInitThread, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^ {
isRunning = false;
});