在Swift / Objective-C中实现下一个线程解决方案

时间:2018-03-07 09:49:42

标签: ios objective-c swift multithreading

我开始学习 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();
}

2 个答案:

答案 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;
});