标签: completionhandler

如何在Swift中使用完成处理程序创建一个函数?

我只是好奇我将如何处理这个问题.如果我有一个函数,并且我想在完全执行时发生某些事情,我该如何将它添加到函数中?谢谢

function completionhandler swift

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

Xcode 8:函数类型不能让参数标签破坏我的构建

似乎由于某种原因,Swift选择通过强制用户删除完成处理程序参数标签来使编码更难以读取.我已经阅读过Swift的讨论,仍然认为这是一个错误.至少他们可以让它成为可选的.

使用Xcode 8构建时 - 有没有办法强制编译器使用Swift 2.3,所以我不再会遇到这些错误?我已经更新了使用旧版Swift的选项(在构建设置下) xcode中的遗留支持 但我似乎仍然得到这个错误:

函数类型不能有参数标签'isloggedIn'; 请改用"_"

错误Xcode 8

如何在完成处理程序中保留标签?

ios completionhandler swift xcode8

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

具有Swift中可选完成块的功能

当我创建一个函数时,我可以通过给它一个默认值来使参数成为可选参数,如下所示:

func foo(bar: String = "foobar") {}
Run Code Online (Sandbox Code Playgroud)

我想用完成块做同样的事情(使它成为可选项).我尝试过以下方法:

func foo(completionBlock: (foo: String) -> () = () -> ())
func foo(completionBlock: (foo: String) -> () = (foo: String) -> ())
func foo(completionBlock: (foo: String) -> () = ((foo: String) -> ()))
func foo(completionBlock: (foo: String) -> () = ((foo: String) in))
func foo(completionBlock: (foo: String) -> () = {(foo: String) in})
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

编辑:
这是一个重复的问题,对不起.但是,我在原始问题中找不到解决方案.所以nathan的答案是最好的答案

completionhandler swift

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

完成处理程序和块之间的区别:[iOS]

我当我在使用它们既完成处理并阻止混乱SwiftObjective-C.当我Swift在谷歌搜索块时,它显示完成处理程序的结果!有人能告诉我什么是相对于完成处理器和块之间的差异SwiftObjective-C

block objective-c ios completionhandler swift

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

使用reloadData方法重新加载UICollectionView会在重新加载数据之前立即返回

我需要知道何时重新加载UICollectionView已经完成以便以后配置单元格(因为我不是单元格的数据源 - 其他明智的就是已经完成它...)

我试过像这样的代码

[self.collectionView reloadData];
[self configure cells]; // BOOM! cells are nil
Run Code Online (Sandbox Code Playgroud)

我也试过用

[self.collectionView performBatchUpdates:^{
  [self.collectionView reloadData];
    } completion:^(BOOL finished) {
        // notify that completed and do the configuration now
  }];
Run Code Online (Sandbox Code Playgroud)

但是当我重新加载数据时,我正在崩溃.

如何将数据重新加载到集合中,并且只有在完成重新加载后才能重新加载 - 执行特定的完成处理程序

objective-c-blocks completionhandler uicollectionview uicollectionviewcell

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

完成处理程序如何在iOS上运行?

我试图了解完成处理程序和块.我相信你可以在没有完成处理程序的情况下使用块进行许多深度编程,但我认为我理解完成处理程序是基于块的.(所以基本上完​​成处理程序需要块,但不是相反).

所以我在互联网上看到了关于旧的twitter框架的代码:

[twitterFeed performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
        if (!error) {
            self.successLabel.text = @"Tweeted Successfully";
            [self playTweetSound];
        } else {
            // Show alert
        }
        // Stop indicator 
        sharedApplication.networkActivityIndicatorVisible = NO;
    }];
Run Code Online (Sandbox Code Playgroud)

这里我们调用一个方法来做东西(执行TWRequest)并在完成responseData&urlResponse&error时返回.只有当它返回时才会执行测试授予的块并停止活动指示器.完善!

现在这是我为不同的应用程序设置的设置,但我正在尝试将各个部分组合在一起:

@interface
Define an ivar
typedef void (^Handler)(NSArray *users);
Declare the method
+(void)fetchUsersWithCompletionHandler:(Handler)handler;

@implementation
+(void)fetchUsersWithCompletionHandler:(Handler)handler {
    //...Code to create NSURLRequest omitted...
    __block NSArray *usersArray = [[NSArray alloc] init];

    //A. Executes the request 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

        // Peform the request
        NSURLResponse *response;
        NSError *error = nil;
        NSData …
Run Code Online (Sandbox Code Playgroud)

ios objective-c-blocks completionhandler

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

在iOS7 GM上不调用完成处理程序

我正在使用AVAssetWriter,它完全适用于iOS6.

问题是,当我打电话时finishWritingWithCompletionHandler,iOS7 GM上没有调用完成处理程序.

我打电话markAsFinished,甚至endSessionAtSourceTime在我调用finishWritingWithCompletionHandler之前.

它在iOS6上运行良好.

甚至更多,在iOS7上,它可以工作一段时间,然后它再也不起作用了.

我不知道为什么,但如果我使用警报视图调用该方法,它就可以工作.于是,我就performSelectorOnMainThreadinBackground,但它并没有帮助.

有任何想法吗?

avassetwriter completionhandler ios7

18
推荐指数
2
解决办法
3688
查看次数

在NSURLConnection中从Swift中的completionHandler中获取数据

我正在尝试编写一个将执行异步GET请求的函数,并返回响应(作为任何数据类型,但在这里它是NSData).

这个问题基于:如何使用NSURLConnection completionHandler和swift

func getAsynchData() -> NSData {
    var dataOutput : NSData
    let url:NSURL = NSURL(string:"some url")
    let request:NSURLRequest = NSURLRequest(URL:url)
    let queue:NSOperationQueue = NSOperationQueue()

    NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
            /* this next line gives the below error */
            dataOutput = data
    })
    return dataOutput
}
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

error: variable 'dataOutput' captured by a closure before being initialized
Run Code Online (Sandbox Code Playgroud)

我已经尝试从completionHandler返回值,但它需要一个void返回,这让我想起了我希望在没有帮助的情况下解决这个问题......:D

我看过: 如何在Swift中使用completionHandler Closure返回? 但这并没有真正回答我的问题.我的目标是从我的异步请求中获取数据,以便在我的代码中的其他地方使用.我是否应该在此块中执行此请求的所有工作而不是获取数据?

谢谢!

编辑

好的,所以我有一个选项,我觉得可能有用,但对我来说似乎不对.有人能告诉我这是否是实现目标的最佳方式?

func doThingsWithData( data: NSData ) -> …
Run Code Online (Sandbox Code Playgroud)

closures nsurlrequest completionhandler swift

13
推荐指数
1
解决办法
5912
查看次数

两个方法的completionHandler performFetchWitchCompletionHandler和didReceiveRemoteNotification相互干扰?

自2017年11月起,我有一个iOS(swift)应用程序可用AppStore.我添加了Firebase Analytics和Crashlytics,以主动查看在开发和测试期间未发生的问题.

我目前正在努力使用以下Stacktrace,我在Firebase Crashlytics Dashboard中多次使用:

来自Firebase的Stacktrace

致命异常:NSInternalInconsistencyException此请求已被绝育 - 您不能调用-sendResponse:两次,也不能在编码后

Fatal Exception: NSInternalInconsistencyException
0  CoreFoundation                 0x1ac20bef8 __exceptionPreprocess
1  libobjc.A.dylib                0x1ab3d9a40 objc_exception_throw
2  CoreFoundation                 0x1ac12006c +[_CFXNotificationTokenRegistration keyCallbacks]
3  Foundation                     0x1acc0c3e0 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:]
4  BaseBoard                      0x1aea6cd68 __40-[BSAction sendResponse:withCompletion:]_block_invoke
5  libdispatch.dylib              0x1abc44484 _dispatch_client_callout
6  libdispatch.dylib              0x1abc24754 _dispatch_lane_barrier_sync_invoke_and_complete
7  BaseBoard                      0x1aea20c60 -[BSAction sendResponse:withCompletion:]
8  UIKitCore                      0x1d8c20698 -[UIHandleRemoteNotificationAction sendResponse:]
9  UIKitCore                      0x1d9054d3c __91-[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion:]_block_invoke_3.2891
10 libdispatch.dylib              0x1abc436c8 _dispatch_call_block_and_release
11 libdispatch.dylib              0x1abc44484 _dispatch_client_callout
12 libdispatch.dylib              0x1abc23b44 _dispatch_main_queue_callback_4CF$VARIANT$armv81
13 CoreFoundation                 0x1ac19a1bc __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__
14 CoreFoundation                 0x1ac195084 __CFRunLoopRun
15 CoreFoundation …
Run Code Online (Sandbox Code Playgroud)

ios completionhandler swift background-fetch

13
推荐指数
1
解决办法
1963
查看次数

Java中的完成处理程序?

我一直在为iOS编码,我对Objective-C中的块概念非常熟悉.现在我正在使用Java for Android并尝试将一些应用程序从Android转换为iOS.

我读到Java中没有完美的块相当,所以我想知道实现完成处理程序或任何可以起作用的东西的最佳替代方法.

java completionhandler

12
推荐指数
1
解决办法
8872
查看次数