GET 請求在 success Block 內能拿到數據,Block 外 NSLog 打印 null,因網絡請求異步執行,Block 外代碼先於回調執行。
- (void)fetchWindDirectionWithCompletion:(void(^)(NSString *direction))completion {
[manager GET:url parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {
NSString *dir = responseObject[@"winddirection"];
if (completion) completion(dir); // 回調傳出
} failure:^(NSURLSessionTask *task, NSError *error) {
if (completion) completion(nil);
}];
}
// 調用處
[self fetchWindDirectionWithCompletion:^(NSString *dir) {
NSLog(@"風向: %@", dir); // 這裡安全使用數據
[self updateUIWithDirection:dir];
}];
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
__block NSString *dir;
[manager GET:... success:^(...) { dir = ...; dispatch_semaphore_signal(sema); } ...];
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); // 阻塞等待
NSLog(@"%@", dir);
NSOperationQueue / Combine / async/await (Swift 5.5+) 管理複雜依賴鏈。