Swift의 새로운 기능입니다. Objective c에 코드가 있으며이 코드에서 NSMUtableDictionary가 컴포지션 핸들러 블록으로 반환됩니다.
완료 블록에서 API를 누르고 API 응답 사전을 반환해야합니다. 내 코드는 Objective c에서 완벽하게 실행됩니다. 그러나 브리지 헤더를 사용하여 신속하게 동일한 방법을 호출하면 충돌이 발생합니다.
내 목표 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)
});
문제가 무엇이며 어떻게 해결해야하는지 알려주십시오. 목표 C뿐만 아니라 신속하게 사용해야합니다
- 답변 # 1
- 답변 # 2
먼저 디버깅을 활성화하고 디버그->중단 점->예외 중단 점 작성을 추가하십시오.
Xcode에서 디버깅-https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/debugging_with_xcode/chapters/debugging_tools.html
발생하고있는 오류 찾기
내 코드 버전은 이쪽
NSMutableDictionary
- 답변 # 3
typealias CompletionHandler = (NSMutableArray?) -> Void mycompletionBlock { (array) in print((array?.object(at: 0))!) } func mycompletionBlock(block: CompletionHandler) { let array = NSMutableArray() array.add("hello") block(array) }
에?을 추가하십시오.NSMutableDictionary
MYClass.myMethod("param Value", complitionHandler: {(MyResponse: NSMutableDictionary?) -> Void in print("MyResponse = \(MyResponse)") } as? MyCompletionHandler)
- ios : 해당 파일이나 디렉토리가 없기 때문에 파일에 액세스할 수 없습니다.
- ios : 설정에서 장치를 잊은 경우 페어링 팝업이 다시 표시됩니다.
- ios : Swift 4에서 객체 배열과 같은 구조로 정적 데이터를 형성하는 방법은 무엇입니까?
- ios : Objective-C의 조건부 가져오기
- ios : UIToolbar의 색상을 키보드와 동일하게 만드는 방법
- ios : UITabBar의 버튼에 accessibilityIdentifier를 설정하는 방법
- ios : Swift로 외부 USB 저장소에 데이터 쓰기
- ios : Objective C에서 Swift 프로토콜에 액세스한 다음 Swift에서 다시 액세스
- ios : @objc를 사용한 후 swift 메소드에 매개변수로 메소드를 전달하는 Objective-C
- ios : "특성에 따라 다름" 버튼은 어디에 있습니까?
내 의견에서 말했듯이 응답 매개 변수가 nil인지 확인하십시오. 문제가 빠른 빠른 번역과 관련이 있습니다.이 매개 변수는 객관적 C에서 nullable이어야하며 빠른으로 변환해야합니다.
NSMutableDictionary?
가 아니라