วิธีที่ดีที่สุดในการใช้ MVC ใน iOS

ฉันทำงานกับ MVC มาเป็นเวลานาน แต่ไม่มั่นใจว่าฉันใช้รูปแบบนี้ใน iOS อย่างถูกต้อง

นี่คือความเข้าใจและซอร์สโค้ดของฉันซึ่งฉันใช้สำหรับการดิวิชั่นในมุมมองโมเดลและคอนโทรลเลอร์

คำอธิบาย:

  1. โมเดล (เช่น - คลาส MyModel) โมเดล นี่คือข้อมูลของฉัน ฉันใช้โมเดลสำหรับการคำนวณที่กำหนด การดึงข้อมูลจากอินเทอร์เน็ต และฉันจะแจ้งให้ผู้ควบคุมทราบเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงโมเดล เช่น ผ่านทาง NSNotificationCenter

  2. คอนโทรลเลอร์ (เช่น - คลาส MyController) คอนโทรลเลอร์สามารถติดต่อคำขอข้อมูลโมเดลได้โดยตรง และไปที่จอแสดงผลในมุมมองโดยตรง

  3. ดู (เช่น - คลาส MyView) ดู - แสดงและรวบรวมเหตุการณ์จากผู้ใช้ มุมมองสามารถโต้ตอบกับคอนโทรลเลอร์ผ่านการดำเนินการตามเป้าหมายและการมอบหมาย

รหัส:

คลาส MyModel:NSObject

    .h ... (some header code)
    .m
    Initialization method...

    // method for get data from internet
    -(NSData *)my_getDataFromInternet:(NSURL *)url{
       NSData *data=[NSData dataWithContentsOfURL:url];
       return data;    
    }

คลาส MyController:UIVIewController

     #import "MyView.h"
     .h
     MyView * my_view;

     #import "MyData.h"
     .m
     Initialization method...
     - (void)init{
        my_view = [[MyView alloc]init];
        my_view.my_target = self;
        self.view = my_view;
     }

     -(void)mycontrolleraction{
        MyData * my_data = ...
        [my_data my_getDataFromInternet:some_url_image];
        my_view.my_image = [UIImage imageWithData:self.my_data];
     }

คลาส MyView:UIView

     .h
     UIImage * my_image;
     property(nonatomic, assign)id my_target;
     .m
     Initialization method...
     - (void)initWithFrame{
         UIButton * my_button = ...
         [button addTarget:my_target ....
         my_image = ...
         [self addSubview:my_image];
         [self addSubview:my_button];
      }

ฉันเพิ่มเป้าหมายให้กับปุ่มของฉัน - my_target (my_target - นี่คือ MyController ของฉัน) เมื่อผู้ใช้แตะปุ่มของฉัน - วิธีการจะดำเนินการใน MyController และถามข้อมูลจากคลาส MyData ของฉัน

ฉันต้องการทราบว่าข้อผิดพลาดของฉันในการใช้วิธีนี้ใน MVC คืออะไร


person Matrosov Alexander    schedule 20.08.2011    source แหล่งที่มา


คำตอบ (1)


ดูเหมือนว่าคุณมีความคิดที่ถูกต้อง ฉันมักจะคิดว่าโมเดลเป็นสิ่งที่เก็บข้อมูลและดำเนินการกับโมเดลนั้น ดังนั้นจึงดูแปลกนิดหน่อยที่โมเดลจะดึงรูปภาพแล้วส่งคืนโดยไม่จัดเก็บ การมีโมเดลเก็บข้อมูลไว้จะช่วยให้โมเดลไม่ต้องดึงข้อมูลอีกครั้งในภายหลัง แต่วิธีที่คุณมีก็ไม่ผิด และแหล่งที่มาของข้อมูลเป็นสิ่งที่ควรขึ้นอยู่กับโมเดลทั้งหมด

สิ่งหนึ่งที่ฉันแนะนำซึ่งไม่เกี่ยวข้องกับ MVC คือการปฏิบัติตาม ข้อตกลงสำหรับตัวเริ่มต้น วิธีการเริ่มต้นของคุณจะต้องเรียกใช้ตัวเริ่มต้นที่กำหนดของซูเปอร์คลาส ดังนั้น -init ของคอนโทรลเลอร์ของคุณควรมีลักษณะดังนี้:

-(id)init
{
    if ((self = [super init])) {    // double parens to avoid warning about = vs ==
        my_view = [[MyView alloc] init];  // assuming my_view is an ivar
        my_view my_target = self;
    }
    return self;
}

เช่นเดียวกับคลาสมุมมองและโมเดลของคุณ

person Caleb    schedule 20.08.2011
comment
ใช่ ฉันยอมรับว่าฉันได้กระทำข้อผิดพลาดในการเริ่มต้น เป็นเพราะฉันพิมพ์โค้ดทั้งหมดที่นี่บนไซต์แทนที่จะเป็น xcode และรีบเร่งเล็กน้อย ฉันได้ผลลัพธ์ตัวอย่างการโต้ตอบง่ายๆ นี้เพื่อแสดงเมื่อมีการโต้ตอบ มันไม่ใช่โค้ดในอุดมคติ - และเป็นตัวอย่างง่ายๆ ของการหารใน MVC ขอบคุณสำหรับความคิดเห็นและคำตอบสำหรับคำถามของฉัน - person Matrosov Alexander; 20.08.2011