আমি কীভাবে এনএসটিমেমার ব্যবহার করব?


344

আমি কীভাবে ব্যবহার করব NSTimer? কেউ আমাকে ধাপে ধাপে নির্দেশনা দিতে পারেন?


1
আমি parameterwise তথ্য পেয়েছিলাম উপর pravinmagdum.wordpress.com/2010/12/30/how-to-use-nstimer এটিতে চেহারা আছে .. তোমার জন্য সহায়ক হতে পারে

উত্তর:


616

প্রথমত আমি আপনার দৃষ্টি আকর্ষণ করতে চাই কোকো / সিএফ ডকুমেন্টেশনের দিকে (যা সর্বদা কলের দুর্দান্ত পোর্ট)। অ্যাপল ডক্সের প্রতিটি রেফারেন্স নিবন্ধের শীর্ষে একটি অংশ রয়েছে "কমপীয়ান গাইডস", যা এই বিষয়টির নথিবদ্ধ (যদি উপস্থিত থাকে) জন্য গাইড নির্দেশ করে exist উদাহরণস্বরূপ, সঙ্গে NSTimer, ডকুমেন্টেশন তালিকা দুই সহচর গাইড:

আপনার পরিস্থিতির জন্য, টাইমার প্রোগ্রামিং বিষয়গুলির নিবন্ধটি সবচেয়ে কার্যকর হতে পারে, থ্রেডিংয়ের বিষয়গুলি সম্পর্কিত হলেও ডকুমেন্টিং ক্লাসের সাথে সর্বাধিক সরাসরি সম্পর্কিত নয়। আপনি যদি টাইমার প্রোগ্রামিং বিষয়গুলির নিবন্ধটি একবার দেখেন তবে এটি দুটি ভাগে বিভক্ত:

  • টাইমার
  • টাইমার ব্যবহার করা

এই নিবন্ধটি গ্রহণ করে এমন নিবন্ধগুলির জন্য, প্রায়শই ক্লাস এবং এটির জন্য কী ব্যবহার করা হয় তার একটি সংক্ষিপ্তসার থাকে এবং তারপরে "টাইমার্স ব্যবহার করে" বিভাগে এই ক্ষেত্রে কীভাবে এটি ব্যবহার করতে হবে সে সম্পর্কে কিছু নমুনা কোড । "একটি টাইমার তৈরি এবং সময় নির্ধারণ", "একটি টাইমার থামানো" এবং "মেমরি পরিচালনা" বিভাগ রয়েছে are নিবন্ধ থেকে, একটি নির্ধারিত, অ-পুনরাবৃত্তি টাইমার তৈরি করা এরকম কিছু করা যেতে পারে:

[NSTimer scheduledTimerWithTimeInterval:2.0
    target:self
    selector:@selector(targetMethod:)
    userInfo:nil
    repeats:NO];

এটি একটি টাইমার তৈরি করবে যা ২.০ সেকেন্ড পরে চালিত হয় এবং targetMethod:এটি selfএকটি আর্গুমেন্টের সাথে কল করে , যা এটির নির্দেশকNSTimer উদাহরণের ।

এরপরে আপনি যদি পদ্ধতিটিতে আরও বিশদটি দেখতে চান তবে আরও তথ্যের জন্য আপনি ডক্সে আবার উল্লেখ করতে পারেন, তবে কোডের চারপাশেও ব্যাখ্যা রয়েছে।

যদি আপনি একটি টাইমার যা পুনরাবৃত্তি করে তা বন্ধ করতে চান, (অথবা আগুন জ্বালানোর আগে একটি পুনরাবৃত্তি টাইমার থামিয়ে দিতে পারেন) তবে আপনাকে NSTimerতৈরি হওয়া দৃষ্টান্তের জন্য একটি পয়েন্টার রাখতে হবে ; প্রায়শই এটির ক্ষেত্রে পরিবর্তনশীল হওয়া দরকার যাতে আপনি এটি অন্য পদ্ধতিতে উল্লেখ করতে পারেন। এর পরে আপনি কল করতে পারেন invalidateউপর NSTimerউদাহরণস্বরূপ:

[myTimer invalidate];
myTimer = nil;

nilইনস্ট্যান্স ভেরিয়েবলটি আউট করার পক্ষে এটিও ভাল অনুশীলন (উদাহরণস্বরূপ যদি আপনার পদ্ধতিটি টাইমারকে অবৈধ করে দেয় তবে যদি একাধিকবার কল করা হয় এবং উদাহরণটি ভেরিয়েবলটি সেট না করা থাকে nilএবং NSTimerউদাহরণটি বাতিল করা হয়েছে, তবে এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে)।

নিবন্ধের নীচে মেমরি ম্যানেজমেন্টের বিষয়টিও নোট করুন:

কারণ রান লুপটি টাইমারটি বজায় রাখে, মেমরি পরিচালনার দৃষ্টিকোণ থেকে সাধারণত এটি নির্ধারণ করার পরে টাইমারকে রেফারেন্স রাখার দরকার নেই । যেহেতু আপনি যখন নির্বাচক হিসাবে তার পদ্ধতিটি নির্দিষ্ট করেন তখন টাইমার আর্গুমেন্ট হিসাবে পাস হয়, আপনি সেই পদ্ধতির মধ্যে উপযুক্ত হলে পুনরাবৃত্তি টাইমারকে অকার্যকর করতে পারেন । তবে অনেক পরিস্থিতিতে আপনি টাইমারকে অবৈধ করার বিকল্পটি চান want সম্ভবত এটি শুরু হওয়ার আগেই। এই ক্ষেত্রে, আপনাকে টাইমারটির একটি রেফারেন্স রাখা দরকার, যাতে যখনই উপযুক্ত হয় আপনি এটিকে একটি অবৈধ বার্তা পাঠাতে পারেন। যদি আপনি একটি নির্ধারিত টাইমার তৈরি করেন ("আনসুলেডেড টাইমারগুলি দেখুন"), তবে আপনাকে অবশ্যই টাইমারটির একটি দৃ reference় রেফারেন্স বজায় রাখতে হবে (একটি রেফারেন্স-গণনা করা পরিবেশে, আপনি এটি ধরে রাখবেন) যাতে এটি ব্যবহার করার আগে এটির dellocated না হয়।


ঠিক আছে, একটি প্রশ্ন, আমি আমার কোড হিসাবে কী রাখব যা প্রতি দুই সেকেন্ডে কার্যকর হবে?
ল্যাব 12

আপনি যখন ফোন YESকরবেন repeats:তখন পাস করতেন scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:। যদি আপনি এটি করেন তবে অবশ্যই NSTimerউদাহরণটি (এটি পদ্ধতি দ্বারা প্রত্যাবর্তিত হয়েছে) একটি রেফারেন্স রাখা নিশ্চিত করুন এবং মেমরি ম্যানেজমেন্টের পয়েন্টটি আমি উপরে বর্ণিত অনুসরন করুন।
অ্যালেক্স রোজানস্কি

না, আমি আমার কোডটি কোথায় রাখব যা প্রতি 2 সেকেন্ডে শুরু হবে? উদাহরণস্বরূপ, ধরা যাক যে আমি এটি প্রতি 2 সেকেন্ড পরে একটি বীপ শব্দ করতে চাইছিলাম। আমি কোথায় বীপ শোনার কোড রাখব ..?
ল্যাব 12

যে পদ্ধতিতে আপনি targetএবং এর সাথে নির্দিষ্ট করেছেন selector। উদাহরণস্বরূপ, যদি আপনার টার্গেট হল selfএবং নির্বাচক হয় timerMethod:, পদ্ধতি নামক যখন টাইমার দাবানল হয় timerMethod:সংজ্ঞাসমূহ self। তারপরে আপনি সেই পদ্ধতিতে আপনার যে কোডটি চান তা রাখতে পারেন এবং যখনই টাইমার জ্বলতে থাকে তখন পদ্ধতিটি কল হবে। নোট করুন যে টাইমার অগ্নিকাণ্ডের সময় ডেকে আনা পদ্ধতিটি (যে হিসাবে আপনি পাস করেছেন selector:) কেবলমাত্র একটি যুক্তি নিতে পারে (যা বলা হলে এটি NSTimerউদাহরণের জন্য নির্দেশক )।
অ্যালেক্স রোজানস্কি

দুঃখিত, এর অর্থ "সংজ্ঞায়িত self"
অ্যালেক্স রোজানস্কি

331

টাইমার ব্যবহারের কয়েকটি উপায় রয়েছে:

1) নির্ধারিত টাইমার এবং নির্বাচক ব্যবহার

NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 2.0
                      target: self
                      selector:@selector(onTick:)
                      userInfo: nil repeats:NO];
  • আপনি যদি পুনরায় পুনরায় সেট করেন, টাইমারটি নির্বাচক চালানোর আগে 2 সেকেন্ড অপেক্ষা করবে এবং তারপরে এটি বন্ধ হয়ে যাবে;
  • যদি পুনরাবৃত্তি হয়: হ্যাঁ, টাইমার অবিলম্বে শুরু হবে এবং প্রতি 2 সেকেন্ডে নির্বাচককে কল করার পুনরাবৃত্তি করবে;
  • টাইমারকে থামানোর জন্য আপনি টাইমারকে 'বৈধ পদ্ধতি' বলছেন: [টি অবৈধ];

পার্শ্ব নোট হিসাবে, এমন টাইমার ব্যবহারের পরিবর্তে যা পুনরাবৃত্তি না করে এবং নির্দিষ্ট ব্যবধানের পরে নির্বাচককে কল করে আপনি এই জাতীয় বক্তব্যটি ব্যবহার করতে পারেন:

[self performSelector:@selector(onTick:) withObject:nil afterDelay:2.0];

এটি উপরের নমুনা কোডের মতো একই প্রভাব ফেলবে; তবে আপনি যদি প্রতি নবম বার নির্বাচককে কল করতে চান, আপনি পুনরাবৃত্তি সহ টাইমারটি ব্যবহার করুন: হ্যাঁ;

2) স্ব-নির্ধারিত টাইমার

NSDate *d = [NSDate dateWithTimeIntervalSinceNow: 60.0];
NSTimer *t = [[NSTimer alloc] initWithFireDate: d
                              interval: 1
                              target: self
                              selector:@selector(onTick:)
                              userInfo:nil repeats:YES];

NSRunLoop *runner = [NSRunLoop currentRunLoop];
[runner addTimer:t forMode: NSDefaultRunLoopMode];
[t release];
  • এটি এমন একটি টাইমার তৈরি করবে যা আপনাকে নির্দিষ্ট কাস্টম তারিখে নিজেই শুরু করবে (এক্ষেত্রে, এক মিনিটের পরে), এবং প্রতি এক সেকেন্ডে নিজেকে পুনরাবৃত্তি করে

3) নির্ধারিত টাইমার এবং অনুরোধ ব্যবহার করে

NSMethodSignature *sgn = [self methodSignatureForSelector:@selector(onTick:)];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature: sgn];
[inv setTarget: self];
[inv setSelector:@selector(onTick:)];

NSTimer *t = [NSTimer timerWithTimeInterval: 1.0
                      invocation:inv 
                      repeats:YES];

এবং তার পরে, আপনি যখনই এর মতো প্রয়োজন হয় তখন আপনি নিজেই টাইমারটি শুরু করেন:

NSRunLoop *runner = [NSRunLoop currentRunLoop];
[runner addTimer: t forMode: NSDefaultRunLoopMode];



এবং একটি নোট হিসাবে, অনটিক: পদ্ধতিটি দেখতে এরকম:

-(void)onTick:(NSTimer *)timer {
   //do smth
}

ঠিক আছে, তবে আপনি দেখতে পাচ্ছেন যে আমি আমার অ্যাপ্লিকেশনটির স্বচ্ছতা কমিয়ে দিতে চাই, সুতরাং এনএসটিমিয়ার দিয়ে কীভাবে এটি প্রয়োগ করতে হবে তা আমি জানি না
ল্যাব 12

24
জিজ, এই লোকেরা আজ .. আমার কাছ থেকে ভোট দিন কারণ আপনি এটি শুরু থেকে নির্দিষ্ট করেন নি এবং আমাদের বৃথা লিখতে দিন!
ওফফি 0

28
আপনি বৃথা লিখেন নি। এটি ভাল তথ্য!
willc2

পদ্ধতি 2, "স্ব-নির্ধারিত টাইমার" তে, আমি চাইলে কীভাবে টাইমারটি থামাতে পারি?
সত্যম

1
@ সত্যামসভভ, আপনি টাইমারটি বন্ধ করে থামিয়ে দিতে পারেন, অন্য একটি পদ্ধতি আছে বলে: [টাইমার অবৈধ]; টাইমার = শূন্য;
কিম্পয়


5
#import "MyViewController.h"

@interface MyViewController ()

@property (strong, nonatomic) NSTimer *timer;

@end

@implementation MyViewController

double timerInterval = 1.0f;

- (NSTimer *) timer {
    if (!_timer) {
        _timer = [NSTimer timerWithTimeInterval:timerInterval target:self selector:@selector(onTick:) userInfo:nil repeats:YES];
    }
    return _timer;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}

-(void)onTick:(NSTimer*)timer
{
    NSLog(@"Tick...");
}

@end

একরকম এটি ধরে রাখার চক্র তৈরি করে, তাই MyViewControllerকখনই বিঘ্নিত হয় না।
দারারস্কি

5
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(timerCalled) userInfo:nil repeats:NO];

-(void)timerCalled
{
     NSLog(@"Timer Called");
     // Your Code
}

তুমি এটা কোথায় লিখেছ?
মোহিত

1
@ জিগনেশবি এই উত্তরটি কীভাবে এনএসটিমার ব্যবহার করতে হবে তা ব্যাকগ্রাউন্ডে ব্যবহার সম্পর্কে নয়
মোহিত

আমি ব্যাকগ্রাউন্ড পদ্ধতিতে লিখিত করেছি - (অকার্যকর) অ্যাপ্লিকেশনডিন্টারব্যাকগ্রাউন্ড: (ইউআইএপ্লিকেশন *) অ্যাপ্লিকেশন {}
জিগনেশ বি

হ্যাঁ পুনরাবৃত্তি মোডের সাথে
জিগনেশ বি

অ্যাপলের ডকুমেন্টেশনগুলি কলব্যাক পদ্ধতির স্বাক্ষর সম্পর্কে খুব নির্দিষ্ট। আপনার ভুল।
নিকোলাই রুহে

2

উত্তরগুলি এখানে পরবর্তী টাইমের একটি নির্দিষ্ট সময় অনুপস্থিত:

NSCalendarUnit allUnits = NSCalendarUnitYear   | NSCalendarUnitMonth |
                          NSCalendarUnitDay    | NSCalendarUnitHour  |
                          NSCalendarUnitMinute | NSCalendarUnitSecond;

NSCalendar *calendar = [[ NSCalendar alloc]  
                          initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *weekdayComponents = [calendar components: allUnits 
                                                  fromDate: [ NSDate date ] ];

[ weekdayComponents setHour: weekdayComponents.hour + 1 ];
[ weekdayComponents setMinute: 0 ];
[ weekdayComponents setSecond: 0 ];

NSDate *nextTime = [ calendar dateFromComponents: weekdayComponents ];

refreshTimer = [[ NSTimer alloc ] initWithFireDate: nextTime
                                          interval: 0.0
                                            target: self
                                          selector: @selector( doRefresh )
                                          userInfo: nil repeats: NO ];

[[NSRunLoop currentRunLoop] addTimer: refreshTimer forMode: NSDefaultRunLoopMode];

অবশ্যই, আপনার শ্রেণীর পছন্দসই পদ্ধতিতে "doRefresh" বিকল্প করুন

একবার ক্যালেন্ডার অবজেক্ট তৈরি করার চেষ্টা করুন এবং দক্ষতাগুলির জন্য allUnits কে একটি স্ট্যাটিক করুন make

এক থেকে এক ঘন্টা উপাদান যুক্ত করা ঠিক কাজ করে, মধ্যরাতের পরীক্ষার প্রয়োজন নেই ( লিঙ্ক )

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.