我正在使用Alamofire对虚拟数据源https://jsonplaceholder.typicode.com/posts执行网络请求并将其呈现在我的应用程序中。
我有一个名为NetworkingClient.swift
的文件,该文件将大部分逻辑抽象出来并允许重用。
public class NetworkingClient {
typealias WebServiceResponse = ([[String: Any]]?, Error?) -> Void
func execute(_ url: URL, completion: @escaping WebServiceResponse) {
Alamofire.request(url).validate().responseJSON { response in
print(response)
if let error = response.error {
completion(nil, error)
} else if let jsonArray = response.result.value as? [[String: Any]] {
completion(jsonArray, nil)
} else if let jsonDict = response.result.value as? [String: Any] {
completion([jsonDict], nil)
}
}
}
}
我在主视图控制器文件中的设置函数中调用execute
:
func setUpView() {
let networkingClient = NetworkingClient()
let posts_endpoint = "https://jsonplaceholder.typicode.com/posts"
let posts_endpoint_url = URL(string: TEST_URL_STRING)
networkingClient.execute(posts_endpoint_url) { (json, error) in
if let error = error {
print([["error": error]])
} else if let json = json {
print(json)
}
}
}
我在viewDidLoad()
下的super.viewDidLoad()
中称呼它
我在response in
闭包中设置了断点,但我无法触发其中的任何一个,实际上,我认为它完全跳过了整个过程,我也不知道为什么。
我正在关注this youtube video,该视频指南的操作完全相同,只是他们的请求通过了。
我想念什么?
我正在使用在iOS 12.1上运行的Swift 4,XCode 10,我的AlamoFire版本是4.7
。
答案 0 :(得分:0)
这都是关于异步东西的。您正在使用import { Component, Output, EventEmitter } from '@angular/core';
@Component({
selector: 'app-useparent-checkbox',
template: `
<input
type="checkbox"
(change)="changeChecked($event.currentTarget.checked)">`
})
export class UseparentCheckboxComponent {
@Output() toggle = new EventEmitter<boolean>();
changeChecked(isChecked: boolean) {
this.toggle.emit(isChecked);
}
}
线程在let comp: UseparentCheckboxComponent;
let fixture: ComponentFixture<UseparentCheckboxComponent>;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [ FormsModule ],
declarations: [
UseparentCheckboxComponent
],
});
fixture = TestBed.createComponent(UseparentCheckboxComponent);
comp = fixture.componentInstance;
});
it ('should send true when selected', fakeAsync(() => {
const inputDe = fixture.debugElement.query(By.css('input'));
const inputEl = inputDe.nativeElement;
expect(inputEl.checked).toBeFalsy();
let result;
comp.toggle.subscribe((res: boolean) => {
console.log('result', res);
result = res;
});
inputDe.triggerEventHandler('change', new Event('change'));
tick();
expect(result).toBe(true);
}));
函数中声明NetworkingClient
对象和Alamofire来做东西。因此,setupView
的执行时间不是清除后,.background
从内存中取消分配,它的所有对象都包括networkingClient.execute
。为了防止这种情况,只需在函数外部声明setUpView