我只是好奇我将如何处理这个问题.如果我有一个函数,并且我想在完全执行时发生某些事情,我该如何将它添加到函数中?谢谢
当我创建一个函数时,我可以通过给它一个默认值来使参数成为可选参数,如下所示:
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的答案是最好的答案
我当我在使用它们既完成处理并阻止混乱Swift和Objective-C.当我Swift在谷歌搜索块时,它显示完成处理程序的结果!有人能告诉我什么是相对于完成处理器和块之间的差异Swift和Objective-C?
我需要知道何时重新加载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
我试图了解完成处理程序和块.我相信你可以在没有完成处理程序的情况下使用块进行许多深度编程,但我认为我理解完成处理程序是基于块的.(所以基本上完成处理程序需要块,但不是相反).
所以我在互联网上看到了关于旧的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) 我正在使用AVAssetWriter,它完全适用于iOS6.
问题是,当我打电话时finishWritingWithCompletionHandler,iOS7 GM上没有调用完成处理程序.
我打电话markAsFinished,甚至endSessionAtSourceTime在我调用finishWritingWithCompletionHandler之前.
它在iOS6上运行良好.
甚至更多,在iOS7上,它可以工作一段时间,然后它再也不起作用了.
我不知道为什么,但如果我使用警报视图调用该方法,它就可以工作.于是,我就performSelectorOnMainThread和inBackground,但它并没有帮助.
有任何想法吗?
我正在尝试编写一个将执行异步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) 自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编码,我对Objective-C中的块概念非常熟悉.现在我正在使用Java for Android并尝试将一些应用程序从Android转换为iOS.
我读到Java中没有完美的块相当,所以我想知道实现完成处理程序或任何可以起作用的东西的最佳替代方法.
swift ×6
ios ×4
block ×1
closures ×1
function ×1
ios7 ×1
java ×1
nsurlrequest ×1
objective-c ×1
xcode8 ×1