标签: completionhandler

无法转换'T?'类型的值 预期的参数类型'_?' - 通用类型和完成块

我想实现AlamofireObjectMapper(https://github.com/tristanhimmelman/AlamofireObjectMapper)与Alamofire 3和ObjectMapper(最新版本https://github.com/Hearst-DD/ObjectMapper).

似乎AlamofireObjectMapper没有更新与Alamofire 3合作,所以我试图自己做.

我来到这段代码,现在我被卡住了.

似乎通用类型T在响应的完成块内是不可访问的.是Alamofire3改变还是Swift 2.1改变?

这是错误:

无法转换'T?'类型的值 预期的参数类型'_?'

  public func responseObject<T: Mappable>(queue: dispatch_queue_t?, keyPath: String?, completionHandler: (NSURLRequest, NSHTTPURLResponse?, T?, AnyObject?, ErrorType?) -> Void) -> Self {
    return response(queue: queue) { (request, response, data, error) -> Void in
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
            let JSONResponseSerializer = Request.JSONResponseSerializer(options: .AllowFragments)
            let result = JSONResponseSerializer.serializeResponse(request, response, data, error)
            let parsedObject = Mapper<T>().map(keyPath != nil ? result.value?[keyPath!] : result.value)

            dispatch_async(queue ?? dispatch_get_main_queue()) {
                completionHandler(self.request!, self.response, …
Run Code Online (Sandbox Code Playgroud)

generics completionhandler swift alamofire swift2

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

部分申请thunk崩溃.

无法理解Crashlytics中的崩溃报告.

这是崩溃日志:

Crashed: com.apple.main-thread
0  Rekindlr                       0x10007a728 ViewController.(user_info(Match?, completionHandler : (Bool?) -> ()) -> ()).(closure #1) (ViewController.swift:201)
1  Alamofire                      0x100156678 partial apply for thunk (ResponseSerialization.swift)
2  Alamofire                      0x10015891c specialized Request.(response<A where ...> (queue : OS_dispatch_queue?, responseSerializer : A, completionHandler : (Response<A.SerializedObject, A.ErrorObject>) -> ()) -> Self).(closure #1).(closure #1) (ResponseSerialization.swift:131)
3  libdispatch.dylib              0x1827614bc _dispatch_call_block_and_release + 24
4  libdispatch.dylib              0x18276147c _dispatch_client_callout + 16
5  libdispatch.dylib              0x182766b84 _dispatch_main_queue_callback_4CF + 1844
6  CoreFoundation                 0x182cccdd8 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12
7  CoreFoundation                 0x182ccac40 __CFRunLoopRun + 1628
8 …
Run Code Online (Sandbox Code Playgroud)

completionhandler swift alamofire

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

嵌套完成块是不好的设计标志?

我有一个方法调用三个函数,每个函数向Firebase发出请求并在完成处理程序中传回数据.一旦完成了来自2个完成处理程序的数据,我就会调用另一个方法传入数据并发回有效结果.像这样的嵌套块是设计不佳的标志吗?

    func fetchNearbyUsers(for user: User, completionHandler: usersCompletionHandler?) {

            self.fetchAllUsers(completionHandler: { (users: [User]) in

                ChatProvider.sharedInstance.fetchAllChatrooms(completionHandler: { (chatrooms: [Chatroom]) in

                    self.validateNewUsers(currentUser: user, users: users, chatrooms: chatrooms, completionHandler: { (validUsers: [User]) in
                        guard validUsers.isEmpty == false else {
                            completionHandler?([])
                            return
                        }
                        completionHandler?(validUsers)
                    })
                })
            })
        }
Run Code Online (Sandbox Code Playgroud)

//其他方法

    func fetchAllUsers(completionHandler: usersCompletionHandler?) {

        var users: [User] = []

        let group = DispatchGroup()
        let serialQueue = DispatchQueue(label: "serialQueue")

        DatabaseProvider.sharedInstance.usersDatabaseReference.observe(.value, with: {
            snapshot in
            guard let data = snapshot.value as? [String: AnyObject] else { return }

            for …
Run Code Online (Sandbox Code Playgroud)

oop asynchronous ios completionhandler swift

5
推荐指数
0
解决办法
426
查看次数

如何使用Swift配置后台应用刷新?

我具有以下功能,可以在我的SeachVC(UIViewController)中下载JSON数据,它可以完美运行。

func downloadJSON(){

    guard let url = URL(string: "myURL") else { return }

    URLSession.shared.dataTask(with: url) { (data, response, err) in
        guard let data = data else { return }

        do {
            let downloadedCurrencies = try JSONDecoder().decode([Currency].self, from: data)

            // Adding downloaded data into Local Array
            Currencies = downloadedCurrencies

        } catch let jsonErr {
            print("Here! Error serializing json", jsonErr)
        }

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

为了实现后台应用刷新,我在App Delegate中添加了以下功能;

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point …
Run Code Online (Sandbox Code Playgroud)

background-process ios completionhandler appdelegate swift

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

处理多个完成处理程序

我正在尝试为数组中的每个元素协调几个完成处理程序.

代码基本上是这样的:

var results = [String:Int]()

func requestData(for identifiers: [String])
{
    identifiers.forEach
    {   identifier in

        service.request(identifier, completion: { (result) in
            result[identifier] = result
        })
    }

    // Execute after all the completion handlers finish
    print(result)
}
Run Code Online (Sandbox Code Playgroud)

因此,Array中的每个元素都通过带有完成处理程序的服务发送,并且所有结果都存储在一个数组中.完成所有这些处理程序后,我希望执行一些代码.

我试图这样做 DispatchQueue

var results = [String:Int]()

func requestData(for identifiers: [String])
{
    let queue = DispatchQueue.init(label: "queue")

    identifiers.forEach
    {   identifier in

        service.request(identifier, completion: { (result) in
            queue.sync
            {
                result[identifier] = result
            }
        })
    }

    // Execute after all the completion handlers finish
    queue.sync
    {
        print(result) …
Run Code Online (Sandbox Code Playgroud)

concurrency completionhandler swift dispatch-queue

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

是否可以在委托方法中使用完成处理程序 - Swift

我试图在单身辅助班中处理"谷歌登录".

我有LoginHelper,以及一个用完成处理程序处理登录的方法.如您所知,Google Sign有委托方法.调用委托方法时,我需要通知我的完成处理程序.我不确定,有可能吗?

让我们一起集思广益,或者帮助我.

我的方法如下;

 @objc func googleLoginPressed(viewController:UIViewController, isLoginSuccessfull:(Bool) -> ())
{        
    GIDSignIn.sharedInstance().signIn()
}
Run Code Online (Sandbox Code Playgroud)

delegates ios completionhandler swift

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

如何使用完成处理程序将图像放入 SwiftUI 视图中

我试过这个,但我不知道如何在 SwiftUI 视图中使用结果:

func getProfilePicture(_ completion: @escaping ((UIImage) -> Void)) {

    Alamofire.request(GIDSignIn.sharedInstance()?.currentUser.profile.imageURL(withDimension: 75) ?? "https://httpbin.org/image/png").responseImage { response in

        if let image = response.result.value {
            completion(image)

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你能帮忙,我想把完成处理程序返回的图像放在这个视图中:

struct ProfileView: View {
let profileInfo = ProfileInfo()
var placeHolderImage = Image(systemName: "person")

var body: some View {
    Group {
            placeHolderImage
                .clipShape(Circle())
                .overlay(
                    Circle().stroke(Color.white, lineWidth: 4))
                .shadow(radius: 10)
                .padding(10)
    }

}

}
Run Code Online (Sandbox Code Playgroud)

我希望它返回一个 UIImage 以便我最终可以在 SwiftUI 视图中使用它。我已经尝试使用带有 @escaping 完成处理程序的方法,但我不知道如何使用它来解决问题。谢谢!

completionhandler swift swift5 swiftui

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

为什么NSAnimationContext completeHandler不起作用(有时)?


    // wc here is an NSWindowController

    [NSAnimationContext beginGrouping];
    [[NSAnimationContext currentContext] setDuration:0.5f];

    if (duplication) {
        NSPoint origin = initialSize.origin;
        origin.y += initialSize.size.height;
        origin = [wc.window cascadeTopLeftFromPoint:origin];
        origin.y -= initialSize.size.height;
        //[[wc.window animator] setFrameOrigin:origin];   // Why setFrameOrigin and cascadeTopLeftFromPoint are not animated?
        initialSize.origin = origin;
        [[wc.window animator] setFrame:initialSize display:YES];
    }

    // This block should be invoked when all of the animations started above have completed or been cancelled.
    // For not to show the edit window till the duplication animation not finished
    [NSAnimationContext …
Run Code Online (Sandbox Code Playgroud)

objective-c nsanimationcontext completionhandler

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

从 Swift 3 中的 URL 列表下载内容的安全方法

我有一个提供图像资源位置的 URL 列表。我设法找到了解决方案,但我觉得似乎有比下面代码中显示的过程更好的方法。非常感谢有关如何改进此方法以异步检索图像的任何提示!

在我附加每个项目之后调用completionHandler,并在异步块之外将1添加到索引(i),这意味着while循环在最后一个url被完全处理之前迭代到下一个url项目,这不是很奇怪吗?

typealias imagesHandler = (_ images: [UIImage]) -> Void

func fetchImages(forUser user: User, completionHandler: imagesHandler?) {

    var images = [UIImage]()

    self.fetchImageUrlList(forUser: user) { (urlList: [URL]) in

        var i = 0

        while i <= urlList.count - 1 {
            let request = URLRequest(url: urlList[i])
            let dataTask = URLSession(configuration: .default).dataTask(with: request, completionHandler: {
                (data: Data?, response: URLResponse?, error: Error?) in
                guard error == nil else { return }
                guard let data = data else { return }
                guard let image …
Run Code Online (Sandbox Code Playgroud)

loops asynchronous while-loop completionhandler swift

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

用于 mapView.setRegion 动画的 Swift 完成处理程序?

我试图弄清楚如何判断动画何时完成:

self.mapView.setRegion(MKCoordinateRegionForMapRect(mapRect), animated: true)

它看起来setRegion不像其他命令那样支持完成处理程序。

我知道如何使用这样的方法创建一个通用的完成处理程序: 如何在 Swift 中创建一个带有完成处理程序的函数?

但我不知道要检查什么变量来验证动画是否已完成。

animation completionhandler swift

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