我的应用程序有目标 C 和 swift 的代码。网络调用方法是用 Objective C 编写的,通过块返回结果。
- (void)getTopSearchResult:(void (^)(NSDictionary *,NSError *))completion {
NSString *urlString = [IKURLFactory getSikTopSearchUrl];
IKRestJsonEngine *jsonEngine = [[IKRestJsonEngine alloc] init];
NSDictionary *jsonObject = [jsonEngine jsonObject];
[[IKNetworkManager sharedInstance] invokeRESTRequestWithRequestMethodType:IKRESTNetworkMethodTypeGet
URLString:urlString RequestHeaders:jsonObject
RequestBody:nil RequestIdentifier:nil
CompletionHandler:^(NSDictionary *data,NSError *error) {
if (error) {
completion(nil,error);
return;
}
if (data.count > 0) {
completion(data,nil);
}
}];
}
我正在像这样从我的 swift viewModel 类调用上面的函数 -
func getTopSearchData() {
IKAppNetworkManager.instance()?.getTopSearchResult({ [weak self] (dict,error) in
if (error != nil) {
print(error?.localizedDescription ?? "")
} else {
if let jsonDict = dict {
do {
let jsonData = try JSONSerialization.data(withJSONObject: jsonDict,options: .prettyPrinted)
let searchResults = try JSONDecoder().decode(IKTopSearchModel.self,from: jsonData)
if let tmpResults = searchResults.result {
self?.topSearchList = tmpResults
}
} catch {
print(error.localizedDescription)
}
}
}
})
}
然后通知ViewController Like
private(set) var topSearchList = [IKTopSearchModelElement]() {
didSet {
delegate?.didReceivedTopSearchResult()
}
}
但是上面的实现导致了 ViewController 和 ViewModel 之间的强保留循环。我已经尝试过协议、关闭中的弱自引用、完成处理程序和 Nsnotification 中心来通知视图控制器重新加载视图。