iOS 비동기 스레드가 종료될 때까지 기다렸다가 다음 코드 실행

4474 단어 기술 노트
오늘 블루투스 값 전달 방법에 대한 문제가 발생했습니다. 블루투스 통신 모듈을 도구 클래스에 봉했습니다. 그리고 저는 블록 코드 블록을 정의했습니다. 외부에서 블루투스로 데이터를 보냈을 때 정의된 블록 코드 블록을 외부 호출자에게 되돌려 주려고 합니다.그러나 외부 호출자는 Block 코드 블록 밖에서 이 데이터를 사용해야 한다.예를 들어 다음과 같은 데모 코드가 있습니다.
#import "ViewController.h"

typedef void(^SuccessBlock)(NSString *Obj);

@interface ViewController ()

@property (nonatomic, weak) SuccessBlock    successBlock;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self getADataFromOtherOperationQueue:^(NSString *Obj) {

        NSLog(@"%@",Obj);

    }];

    NSLog(@"22222222222222222");
}

- (void)getADataFromOtherOperationQueue:(SuccessBlock)successBlock
{
    self.successBlock = successBlock;

    [self performSelector:@selector(setADataToOtherOperationQueue) withObject:nil afterDelay:5.0];

}

- (void)setADataToOtherOperationQueue
{
    self.successBlock(@"11111111111111111");
}

인쇄 결과는 항상 아래의 이런 것을 피하기 어렵다. 설령 내가 자물쇠를 채웠다 하더라도 안 된다.
22222222222222222
11111111111111111

나중에 검색을 해보니 좋은 방법이 하나 있었어요.
#import "ViewController.h"

typedef void(^SuccessBlock)(NSString *Obj);

@interface ViewController ()

@property (nonatomic, weak) SuccessBlock    successBlock;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self getADataFromOtherOperationQueue:^(NSString *Obj) {

        //    RunLoop  
        CFRunLoopStop(CFRunLoopGetMain());

        NSLog(@"%@",Obj);
    }];

    //    RunLoop
    CFRunLoopRun();


    NSLog(@"22222222222222222");
}

- (void)getADataFromOtherOperationQueue:(SuccessBlock)successBlock
{
    self.successBlock = successBlock;

    [self performSelector:@selector(setADataToOtherOperationQueue) withObject:nil afterDelay:5.0];

}

- (void)setADataToOtherOperationQueue
{
    self.successBlock(@"11111111111111111");
}

인쇄 결과:
11111111111111111
22222222222222222

나의 문제는 순식간에 해결되었다,very good!!!
또한 감사합니다, 대신의 공유 원문 링크: iOS 비동기 요청 대기 전송 방법 요약

좋은 웹페이지 즐겨찾기