Objective C Complition Block在快速

时间:2018-04-17 08:42:45

标签: ios objective-c swift xcode

我是Swift的新手我在Objective c中有一个代码,在这段代码中,NSMUtableDictionary作为一个合成处理程序块返回。

我需要点击API并在完成块中返回API响应字典。 我的代码在Objective c中完美运行。但是当我使用桥头从swift调用相同的methd时会导致崩溃。

我的目标C代码是:

MYClass.h

#import <UIKit/UIKit.h>
@interface MYClass : NSObject
typedef void(^MyCompletionHandler)(NSMutableDictionary *_Nullable);

+ (void)myMethod:(NSString*_Nullable)param ComplitionHandler:(MyCompletionHandler _Nullable)complitionHandler;
@end

MYClass.m

#import "MYClass.h"
@implementation MYClass
 + (void)myMethod:(NSString*_Nullable)param ComplitionHandler:(MyCompletionHandler _Nullable)complitionHandler  {


dispatch_queue_t queue = dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
/// here I've written code to hit APi and got successfull response in nsmutableDict
NSMutableDictionary *response = [[NSMutableDictionary alloc]init];

response = jSonResponse;


 dispatch_async(dispatch_get_main_queue(), ^{
            complitionHandler (response);
        });

});
}
@end

现在当我在我的应用程序中使用它时如果我在Objective C中使用它它运行得很好但是如果我在Swift Bridging标头中导入这个文件并且当我在Swift文件中使用它时会导致崩溃

在目标C中:

[MYClass myMethod:@”param Value” ComplitionHandler:^(NSMutableDictionary * MyResponse) {
        NSLog(@"Response = %@",MyResponse);           
   }];

并迅速

MYClass.myMethod("param Value", complitionHandler: {(MyResponse: NSMutableDictionary) -> Void in
            print("MyResponse = \(MyResponse)")
        } as? MyCompletionHandler)

快速崩溃发生在以下行

complitionHandler (response);

当需要在完成块中返回响应时

  dispatch_async(dispatch_get_main_queue(), ^{
   complitionHandler (response);  //Thread 1: EXC_BAD_ACCESS (code=1, address=0x10)
            });

任何人都可以告诉我这是什么问题以及如何解决这个问题。我需要在swift和Objective c中使用in

3 个答案:

答案 0 :(得分:3)

正如我在评论中所说,检查你的响应参数是否为零,你的问题与错误的快速翻译有关,该参数应该在目标C中可以为空并且转换为swift应该是NSMutableDictionary?而不是{ {1}}

答案 1 :(得分:0)

首先请启用调试并添加Debug - &gt;断点 - &gt;创建异常断点。

在Xcode中调试 - https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/debugging_with_xcode/chapters/debugging_tools.html

找出正在发生的错误

我的代码版本是

typealias CompletionHandler = (NSMutableArray?) -> Void

  mycompletionBlock { (array) in
            print((array?.object(at: 0))!)

        }

    func mycompletionBlock(block: CompletionHandler)
    {
        let array = NSMutableArray()
        array.add("hello")

        block(array)

    } 

答案 2 :(得分:0)

添加到NSMutableDictionary

MYClass.myMethod("param Value", complitionHandler: {(MyResponse: NSMutableDictionary?) -> Void in
            print("MyResponse = \(MyResponse)")
        } as? MyCompletionHandler)