iOS 구성 요 소 는 충돌 을 피 하 는 작은 기술 공유 에 의존 합 니 다.

문제 의 원인
본 고 는 YBImage Browser[1]구성 요소 로 예 를 들 었 다.
YBImage Browser 는 SDWebImage 에 의존 하고 있 습 니 다.CocoaPods 를 사용 하여 프로젝트 에 통합 할 때 충돌 에 의존 하 는 문제 가 발생 할 수 있 습 니 다.최근 에 커 뮤 니 티 에서 여러 가지 Issues 를 제 기 했 고 Insights->Traffic->Popular content 에서 이런 문 제 를 보 았 기 때문에 해결 하지 않 을 수 없습니다.
엄격 한 버 전 제한
오픈 소스 구성 요소 의 교체 과정 에서 상부 인터페이스의 아래로 호 환 을 확보 하 는 것 이 좋 습 니 다.성능 을 최적화 하고 메모 리 를 제어 하기 위해 YBImage Browser 는 최상 위 인 터 페 이 스 를 직접 사용 하지 않 고 다운로드 모듈 과 캐 시 모듈 을 단독으로 사 용 했 습 니 다.SDWebImage 의 교체 업 그 레이 드 는 필자 의 구성 요소 가 호 환 되 지 못 하기 쉬 우 므 로 예전 에는 이와 같이 의존 해 왔 습 니 다.

s.dependency 'SDWebImage', '~> 5.0.0'
이렇게 하 는 장점 은 충분 한 작은 버 전의 범 위 를 제한 하고 SDWebImage 인터페이스 변동 으로 인해 구성 요소 코드 오류 가 발생 할 위험 을 낮 추 는 것 이다.그러나 SDWebImage 가 5.1.0 으로 업그레이드 되면 해당 API 변동 여부 와 관 계 없 이 코코아 팟 은 의존 충돌 로 간주한다.
다른 구성 요 소 는 서로 다른 버 전의 SDWebImage 에 의존 합 니 다.
두 구성 요소 가 같은 구성 요소 의 다른 버 전에 의존 하고 의존 하 는 버 전이 교차 하지 않 았 을 때:

A.dependency 'SDWebImage', '~> 4.0.0'
B.dependency 'SDWebImage', '~> 5.0.0'
그러면 A 와 B 가 동시에 프로젝트 에 통합 되면 의존 충돌 이 발생 할 것 이다.
해결 방안
CocoaPods 통합 프로젝트 를 사용 하 는 것 은 매우 편리 하 다.구성 요소 사용자 에 게 있어 모든 장면 에서 쉽게 통합 되 고 앞으로 구성 요소 의 업데이트 최적화 를 누 릴 수 있다.앞에서 언급 한 문 제 는 집적 의 편리 성에 영향 을 줄 수 있다.
더 모호 한 버 전 제한
많은 경우 에 하나의 큰 버 전의 구성 요소 가 API 를 바 꾸 지 않 고 지역 사회 에서 유행 하 는 구성 요소 에 대해 우 리 는 반드시 아래로 호 환 되 기 를 희망 할 수 있 기 때문에 의존 하 는 버 전 제한 을 완화 하면 앞으로 더 많은 버 전 을 덮어 쓸 수 있 습 니 다(규칙 참조:podspec dependency[2]).

s.dependency 'SDWebImage', '>= 5.0.0'
왜 버 전 제한 을 아예 없 애 지 않 습 니까?
YBImage Browser 3.x 는 SDWebImage 5.0.0 을 기반 으로 개 발 된 것 이기 때문에 필 자 는 5.0.0 이전 버 전 을 명확 하 게 호 환 하지 않 을 수 있 기 때문에 SDWebImage 의 미래 교체 버 전에 관련 API 가 호 환 되 지 않 을 때 까지 이 제한 은 모든 버 전 을'완벽'하 게 덮어 씁 니 다.
충돌 에 의존 하 는 폭력 방안 을 피하 다.
다른 구성 요소 가 서로 다른 버 전의 SDWebImage 에 의존 할 때 거 친 해결 방안 은 다음 과 같 습 니 다.
•다른 구성 요소 가 의존 하 는 SDWebImage 버 전 을 직접 수정 합 니 다.
•YBImage Browser 를 수 동 으로 항목 을 가 져 오고 코드 를 수정 하여 현재 SDWebImage 버 전에 적응 합 니 다.
•커 뮤 니 티 친구 의 한 Issue 에서 언급 한 방법:~/.coapods/repos 디 렉 터 리 에서 YBImage Browser 폴 더 를 찾 아 해당 버 전의 podspec.json 파일 에서 SDWebImage 에 대한 의존 버 전 을 변경 합 니 다.
분명 한 것 은 위의 몇 가지 방안 이 우아 하지 않 고 수 동 으로 항목 을 가 져 오 면 구성 요소 의 업데이트 최적화 를 누 릴 수 없 으 며 로 컬 repo 정 보 를 수정 하면 repo 목록 의 업데이트 로 인해 복원 된다.
충돌 에 의존 하지 않 는 우아 한 방안
의존 충돌 이 발생 하 는 것 은 반드시 해결 해 야 할 문제 입 니 다.다른 구성 요소 가 의존 하 는 버 전 제한 은 변수 로 볼 수 있 고 해결 방안 은 구성 요소 의 제작 측면 에서 고려 할 수 있 습 니 다.
일부 사용자 의 빠 른 통합 구성 요 소 를 만족 시 킬 뿐만 아니 라 일부 사용자 가 충돌 에 의존 하 는 전제 에서 구성 요소 의 미래 업데이트 최 적 화 를 누 릴 수 있 도록 하 는 것 이 목표 이다.
정 답 은 subspec 입 니 다.다음은 YBImage Browser.podspec 부분 코드(전체 코드[3])입 니 다.

s.subspec "Core" do |core|
core.source_files = "YBImageBrowser/**/*.{h,m}"
core.dependency 'SDWebImage', '>= 5.0.0'
end
s.subspec "NOSD" do |core|
core.source_files = "YBImageBrowser/**/*.{h,m}"
core.exclude_files = "YBImageBrowser/WebImageMediator/YBIBDefaultWebImageMediator.{h,m}"
end
따라서 사용 자 는 SDWebImage 에 의존 해 야 하 는 지 자 유 롭 게 선택 할 수 있 습 니 다.Podfile 에서 의 소감 은 대체적으로 이 렇 습 니 다.

//    SDWebImage
pod 'YBImageBrowser' 
//     SDWebImage
pod 'YBImageBrowser/NOSD'
그렇다면 YBImage Browser 코드 에서 SDWebImage 에 의존 하고 기본 구현 여 부 를 어떻게 구분 해 야 합 니까?
첫 번 째 단 계 는 추상 적 인 인 터 페 이 스 를 설계 하 는 것 입 니 다.(이 인 터 페 이 스 는 SDWebImage 에 의존 하지 않 습 니 다)

@protocol YBIBWebImageMediator <NSObject>
// Download methode, caching methode, and so on.
@end
두 번 째 단 계 는 YBImage Browser.h 에서 이 인 터 페 이 스 를 따 르 는 속성 을 정의 합 니 다.

///             (      )
@property (nonatomic, strong) id<YBIBWebImageMediator> webImageMediator;
세 번 째 단 계 는 기본 중개 자 를 실현 하 는 것 입 니 다.(이 종 류 는 SDWebImage 에 의존 합 니 다)

@interface YBIBDefaultWebImageMediator : NSObject <YBIBWebImageMediator>
@end
@implementation YBIBDefaultWebImageMediator
//   SDWebImage   API    <YBIBWebImageMediator>     
@end
네 번 째 단 계 는 내부 코드 에서 조건 컴 파일 을 통 해 기본 중개 자 를 가 져 오고 초기 화 하 는 것 입 니 다.

#if __has_include("YBIBDefaultWebImageMediator.h")
#import "YBIBDefaultWebImageMediator.h"
#endif
...
#if __has_include("YBIBDefaultWebImageMediator.h")
_webImageMediator = [YBIBDefaultWebImageMediator new];
#endif
다섯 번 째 단 계 는 YBImage Browser.podspec 에서 도 볼 수 있 습 니 다.SDWebImage 에 의존 하지 않 는 통합 방식 에서 두 개의 파일 을 제외 합 니 다:YBIBDefault WebImage Mediator.{h.m}.
이로부터 목 표를 실현 했다.
•SDWebImage 에 의존 하 는 통합 방식 으로 빠르게 통합 합 니 다.
•SDWebImage 에 의존 하지 않 는 통합 방식 을 사용 하여 각종 상황 에서 의 의존 충돌 을 피하 지만,이러한 상황 에 주의 하려 면프로 토 콜 을 따 르 는 중개 자 를 스스로 실현 해 야 합 니 다.
이상 은 충돌 에 의존 하 는 작은 기 교 를 피 하 는 것 이 므 로 독자 친구 들 이 더 좋 은 건의 나 의견 을 제시 할 수 있 기 를 바 랍 니 다.😁。
레 퍼 런 스
[1]https://github.com/indulgeIn/YBImageBrowser
[2]https://guides.cocoapods.org/syntax/podspec.html#dependency
[3]https://github.com/indulgeIn/YBImageBrowser/blob/master/YBImageBrowser.podspec
총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기