일 년 전 · 김민식 님의 새로운 댓글
UIKit + Rx Vs UIkit + Combine
회사에서 현재 프로젝트가 후자로 되어 있습니다. 이유를 들어보니, - Combine 이 성능이 좋다는 글참고 - 기술 스텍상 SwiftUI 도입은 불가능 이 두 이유를 들었구요. SwiftUI 에는 Combine이 잘 어울리니 당연하다고 생각은 해왔으나 UIKit이랑 사용하는 것은 굳이 Combine으로 할 필요가 있냐는 궁금증이 생겨서요. (물론 먼 미래에 SwiftUI로 컨버팅할때 유용할 것 같습니다.) 혹시 iOS개발자분들 의견은 어떠신가 궁금합니다!
개발자
#ios
#uikit
#rxswift
#combine
#swift
답변 1
댓글 3
조회 190
2년 전 · 김민식 님의 답변 업데이트
ios 신입개발자인데 실무 중 빈틈이 너무 느껴집니다
안녕하세요. ios 개발자로 입사한지 1년정도 되어가는 신입개발자입니다. 입사하기전에도 6개월정도 부트캠프로 배운 지식이 전부였고 입사해서도 별도의 교육이 없었습니다. 그렇다보니 전부 구글링이나 블로그글에 의존하고 잘 정리된 글을 봐도 머릿속에는 남지않는 일회성 정보로만 지나가버리게 됩니다. 이렇게 1년을 반복하니 팀원분들이 하는이야기를 절반은 이해하지 못하고 시간이 지나서 구글링해 30%정도 이해하명서 겨우 버티고 있는 것 같습니다. 업무를 하다보면 모르는 부분이 너무 많은데 이제와서 입문서를 사거나 유튜브, 기초강의를 보자니 너무 기초적인 이야기가 많고 모르는 부분을 구글링으로 공부하자니 공식적이지 않는 정보들이 너무나 많고 공식문서로 공부하자니 너무 이론만 설명되어 실무에 적용을 하는 것을 잘 못하겠습니다. ex) 디자인패턴의 이론은 알지만 각 상황에 어떤식으로 활용을 해야할지 ex) combine 의 다양한 func 중에서 해당기능에 필요한 operator는 무엇인지 ex) concurrency, actor, 메모리 관리, 아키텍쳐 관리, 신기술… 1. 다들 업무를 하다가 모르는 부분이 나오시면 어떻게 공부하시나요? 2. 그리고 이론에 빈틈이 있다는 느낌이 들면 아무리 쉬워도 전공서를 하나 파는게 좋을지, 아니면 모르는 부분만 구글링/공식문서/블로그 등으로 검색해서 공부하는 것이 좋을지 조언 부탁드립니다 긴글 읽어주셔서 감사합니다. 신입개발자를 위해 조언 부탁드리겠습니다🙏
개발자
#ios
#신입개발자
답변 2
댓글 1
추천해요 3
조회 461
2년 전 · 익명 님의 질문 업데이트
api의 첫번째 호출 이후부터 antd Button 렌더링 안되는 이슈가 있습니다.
```jsx import { Popover, Modal, Button, Image, Result } from "antd"; const [prevImg, setPrevImg] = useState(["any"]); const [loading, setLoading] = useState(false); const [removeImgFiles, setRemoveImgFiles] = useState([]); const combinePrevImages = (prevImages, newImages) => { const combinedImages = [...prevImages, ...newImages]; return combinedImages; }; useEffect(() => { const postSeg = async () => { try { const res = await axios.post( "apiurl", { filepath: filePath, clips: sortableList.map(list => `${list.seg.start}-${list.seg.end}`), frame: frameValue }, { proxy: false } ); return res.data; } catch (error) { console.error("Error posting segments:", error); return []; } finally { setLoading(false); } }; const postSegments = async () => { if (segments[0]?.start === 0 && segments[0]?.end === 0) return; if (sortableList && filePath) { setLoading(true); const res = await postSeg(); const combinedPrevImg = combinePrevImages(prevImg, res.results); setPrevImg(combinedPrevImg); console.log("Post Request Success"); } }; postSegments(); }, [filePath, segments, frameValue]); const handleModalOpen = useCallback(() => setModalOpen(true), []); const handleModalClose = useCallback(() => { setRemoveImgFiles([]); setModalOpen(false); }, []); const handleDeleteButtonClick = async () => { if (removeImgFiles.length > 0) { setPrevImg([...removeImgFiles]); setRemoveImgFiles([]); } else { const result = await showSwal({ title: "Are you sure delete?", showCancelButton: true, confirmButtonText: "Confirm", cancelButtonText: "Cancel", confirmButtonColor: "#3085d6", cancelButtonColor: "#d33" }); if (result.isConfirmed) { setRemoveImgFiles([...prevImg]); setPrevImg([]); } const success = await Promise.all(removeImgFiles.map(deleteFiles)); return success; } } const handleRemoveFinish = async () => { if (removeImgFiles) { for (const filePath of removeImgFiles) { try { await removeFile(filePath); } catch (e) { console.log("File Remove Error", e); } } } setRemoveImgFiles([]); handleModalClose(); }; return ( <motion.div initial={{ x: width }} animate={{ x: 0 }} exit={{ x: width }} transition={mySpring} > <div style={{ fontSize: 12, padding: "0 5px", color: "var(--gray12)", display: "flex", justifyContent: "space-between", alignItems: "center" }} > <FaAngleRight title={t("Close sidebar")} size={20} className="angle-right" role="button" onClick={toggleSegmentsList} /> {header} <FaExpandArrowsAlt title={t("Image Inspection")} size={18} className="expand-arrow-alt" style={{ cursor: "pointer" }} role="button" onClick={!loading ? handleModalOpen : handleModalClose} /> <Modal title={t("Image Inspection")} centered onCancel={handleModalClose} open={modalOpen} footer={[]} width="100%" > <div className="imagecontainer"> <Button danger className="toggle-remove" onClick={handleDeleteButtonClick}> {removeImgFiles.length > 0 ? "Add" : "Remove"} </Button> {prevImg?.length > 10 && prevImg.map(img => ( <Popover key={img}> {removeImgFiles?.includes(img) ? ( <span> <Result className="result" icon={<FaSmile />} subTitle="delete" /> </span> ) : <Image key={uuidv4()} src={img} preview={{ src: img }} alt={uuidv4()} /> )} </Popover> ))} </div> <Button block onClick={handleRemoveFinish}> Finish </Button> </Modal> </div> ) ``` api 호출을 통해 frameValue 개수(여기서는 12개씩) 만큼 이미지를 렌더링 하고 있는데 두번째 호출부터는 Button이 렌더링되지 않아서 어디가 잘못됐는지 알고싶습니다.. 필요한 부분이 imagecontainer 클래스네임인 div를 렌더링 해야합니다.
개발자
#react
답변 0
댓글 0
조회 87