相关疑难解决方法(0)

dispatch_after - Swift中的GCD?

我从Apple那里浏览了iBook,找不到任何定义:

有人可以解释结构dispatch_after吗?

dispatch_after(<#when: dispatch_time_t#>, <#queue: dispatch_queue_t?#>, <#block: dispatch_block_t?#>)
Run Code Online (Sandbox Code Playgroud)

grand-central-dispatch ios swift

548
推荐指数
12
解决办法
24万
查看次数

如何在Swift中发出HTTP请求?

我在iBooks中阅读了Apple编程语言Swift,但无法弄清楚如何在Swift中创建一个http请求(类似于CURL).我是否需要导入Obj-C类或者我只需要导入默认库?或者是否无法基于本机swift代码发出HTTP请求?

iphone objective-c ios nsurlsession swift

346
推荐指数
9
解决办法
35万
查看次数

GCD中的并发vs串行队列

我正在努力完全理解GCD中的并发和串行队列.我有一些问题,希望有人能够清楚地回答我.

  1. 我正在读取串行队列的创建和使用,以便一个接一个地执行任务.但是,如果出现以下情况:

    • 我创建了一个串行队列
    • 我使用dispatch_async(在我刚创建的串行队列上)三次来发送三个块A,B,C

    这三个块会被执行:

    • 按顺序A,B,C,因为队列是串行的

      要么

    • 同时(在parralel线程上同时)因为我使用了ASYNC调度
  2. 我正在阅读我可以dispatch_sync在并发队列上使用,以便一个接一个地执行块.在这种情况下,为什么串行队列甚至存在,因为我总是可以使用并发队列,我可以根据需要同步调度多个块?

    谢谢你的任何好解释!

concurrency multithreading grand-central-dispatch ios

106
推荐指数
5
解决办法
5万
查看次数

NSURLConnection使用iOS Swift

我正在尝试按照本教程使用Swift和连接到JSON api NSURLConnection.我可以看到它正在击中网址,但connectionDidFinishLoading似乎没有开火.

import UIKit

class Remote: NSObject {

    var host = "http://localhost:3000"
    var query = String()
    var data: NSMutableData = NSMutableData()

    func connect(query:NSString) {
        self.query = query
        var url = self.document()
        var conn = NSURLConnection(request: url, delegate: self, startImmediately: true)
    }

    func endpoint() -> NSURL {
        var query = self.host + self.query
        return NSURL(string: query)
    }

    func document() -> NSURLRequest {
        return NSURLRequest( URL: self.endpoint() )
    }

    func connection(didReceiveResponse: NSURLConnection!, didReceiveResponse response: NSURLResponse!) { …
Run Code Online (Sandbox Code Playgroud)

nsurlconnection nsurlrequest ios swift

60
推荐指数
1
解决办法
10万
查看次数

如何在操场上使用cocoapods?

我在尝试使用我的主项目之前尝试了一些pod我想确保它能够满足我的要求.最简单的方法是在游乐场尝试.

我试着pod init用不起作用的操场

[!]没有找到xcode项目,请注明一个

非常感谢帮助.

xcode ios cocoapods swift swift-playground

35
推荐指数
3
解决办法
2万
查看次数

单元测试异步队列的模式,在完成时调用主队列

这与我之前提出的问题有关,但不同之处,我认为我会把它扔进一个新问题.我有一些代码在自定义队列上运行异步,然后在完成时在主线程上执行完成块.我想围绕这种方法编写单元测试.我的方法MyObject看起来像这样.

+ (void)doSomethingAsyncThenRunCompletionBlockOnMainQueue:(void (^)())completionBlock {

    dispatch_queue_t customQueue = dispatch_queue_create("com.myObject.myCustomQueue", 0);

    dispatch_async(customQueue, ^(void) {

        dispatch_queue_t currentQueue = dispatch_get_current_queue();
        dispatch_queue_t mainQueue = dispatch_get_main_queue();

        if (currentQueue == mainQueue) {
            NSLog(@"already on main thread");
            completionBlock();
        } else {
            dispatch_async(mainQueue, ^(void) {
                NSLog(@"NOT already on main thread");
                completionBlock();
        }); 
    }
});
Run Code Online (Sandbox Code Playgroud)

}

我投入了主队列测试以获得额外的安全性,但它总是能够击中dispatch_async.我的单元测试如下所示.

- (void)testDoSomething {

    dispatch_semaphore_t sema = dispatch_semaphore_create(0);

    void (^completionBlock)(void) = ^(void){        
        NSLog(@"Completion Block!");
        dispatch_semaphore_signal(sema);
    }; 

    [MyObject doSomethingAsyncThenRunCompletionBlockOnMainQueue:completionBlock];

    // Wait for async code to finish
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); …
Run Code Online (Sandbox Code Playgroud)

objective-c grand-central-dispatch sentestingkit

32
推荐指数
4
解决办法
1万
查看次数

使用`sync`调度队列和使用带有.wait`标志的工作项之间的区别?

我正在学习Apple的GCD,并在Swift 3中观看视频并行编程与GCD.

在这个视频的16:00,DispatchWorkItem描述了一个标志.wait,并且功能和图表都显示了我的想法myQueue.sync(execute:).

等待图

所以,我的问题是; 有什么区别:

myQueue.sync { sleep(1); print("sync") }
Run Code Online (Sandbox Code Playgroud)

和:

myQueue.async(flags: .wait) { sleep(1); print("wait") }
// NOTE: This syntax doesn't compile, I'm not sure where the `.wait` flag moved to.
// `.wait` Seems not to be in the DispatchWorkItemFlags enum.
Run Code Online (Sandbox Code Playgroud)

似乎这两种方法在等待命名队列时阻塞当前线程:

  1. 完成任何当前或以前的工作(如果是连续的)
  2. 完成给定的块/工作项

我对此的理解必须在某处,我错过了什么?

grand-central-dispatch swift3

6
推荐指数
1
解决办法
1643
查看次数

在Swift中从URL获取数据

我正在尝试从服务器下载JSON文件,并按照以下教程进行操作(http://www.learnswiftonline.com/mini-tutorials/how-to-download-and-read-json/

首先,我尝试了“检查响应”部分(我添加了一些部分以查看出了什么问题)

let requestURL: NSURL = NSURL(string: "http://www.learnswiftonline.com/Samples/subway.json")!
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(urlRequest) {
    (data, response, error) -> Void in

        let httpResponse = response as! NSHTTPURLResponse
        let statusCode = httpResponse.statusCode

        if (statusCode == 200) {
            print("Everyone is fine, file downloaded successfully.")
        } else  {
            print("Failed")
        }

task.resume()
Run Code Online (Sandbox Code Playgroud)

这应该打印“每个人都很好〜”或“失败”,但都不会出现...我试图查看statusCode,所以我放进去了print(statusCode)task但是什么也没打印。

这是我的操场截图:

在此处输入图片说明

+

Swift命令行程序中的CFRunLoop

这是我一直在寻找的答案,因为我正在处理OS X命令行应用程序(我将整个程序移到操场上看看会发生什么)。如果您与我相同,请检查

json ios swift

5
推荐指数
1
解决办法
1万
查看次数

为什么不使用CLGeocoder.geocodeAddressString转发地理编码在操场上工作?

我正在尝试将字符串地理编码为快速操场中的纬度/经度.这是我的代码:

import CoreLocation

var geocoder = CLGeocoder()
geocoder.geocodeAddressString("San Francisco, CA", {(placemarks, error)->Void in
    println("here")
})
Run Code Online (Sandbox Code Playgroud)

但是,here永远不会打印到控制台(控制台输出为空白).为什么?

geocoding core-location ios clgeocoder swift

4
推荐指数
1
解决办法
1815
查看次数

在快速操场上使用NSTimer

我想知道如何使用NSTimerSwift游乐场内部.之前已经问过这个问题,但没有一个答案真正回答了这个问题.

这是我的Playground代码:

import Foundation

class MyClass {

    func startTimer() {
        NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "onTimer:", userInfo: nil, repeats: true)
    }

    func onTimer(timer:NSTimer!) {
        println("Timer here")
    }
}

var anInstance = MyClass()

anInstance.startTimer()
Run Code Online (Sandbox Code Playgroud)

实例化NSTimerscheduledTimerWithTimeInterval创建计时器,并在当前运行的循环时间表吧.

但这种方法onTimer从未被调用过.为什么?

nstimer uikit foundation swift swift-playground

4
推荐指数
1
解决办法
3583
查看次数

.sink 和 Subscribers.Sink 有什么区别?

我想用 Future 做一个异步工作。但是下面的.sink() 闭包永远不会被调用。看起来 Future 的实例在它被调用后就被释放了。

    Future<Int, Never> { promise in
        DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
            promise(.success(1))
        }
    }
    .receive(on: DispatchQueue.main)
    .sink(receiveCompletion: { completion in
        print(completion)
    }, receiveValue: {
        print($0)
    })
Run Code Online (Sandbox Code Playgroud)

所以我将.sink() 闭包替换为.subscribe(Subscribers.Sink()) ,如下所示。它工作正常。但问题是我不明白为什么它工作正常。:(对我来说看起来一样。这两个代码有什么区别?我什么时候可以使用.sink(),什么时候不能?

    Future<Int, Never> { promise in
        DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
            promise(.success(1))
        }
    }
    .receive(on: DispatchQueue.main)
    .subscribe(Subscribers.Sink(receiveCompletion: { completion in
        print(completion)
    }, receiveValue: {
        print($0)
    }))
Run Code Online (Sandbox Code Playgroud)

提前致谢。

swift swiftui combine

3
推荐指数
1
解决办法
772
查看次数

在swift 3游乐场回调

嗨,我想在操场上执行这行代码,但得到任何响应输出.我的代码如下:

func testCallbackEmpty( callback: @escaping  () -> Void) {

        DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
            callback()
        }
    }

    testCallbackEmpty(callback: { () -> Void in
        print("Hey called here")
    })


enum Result {
    case OK, FAILED
}


func mainCallback(callback: @escaping (Result) -> Void) {
    DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
        callback(Result.OK)
    }

}

mainCallback(callback: { result in
    print("Hurray \(result)")
})
Run Code Online (Sandbox Code Playgroud)

callback swift swift3

2
推荐指数
1
解决办法
392
查看次数