iOS ব্যাকগ্রাউন্ড থ্রেড শুরু করে


117

আমার আইওএস ডিভাইসে আমার একটি ছোট স্কেলিটডব রয়েছে। যখন কোনও ব্যবহারকারী একটি বোতাম টিপেন, আমি স্ক্য্লাইট থেকে ডেটা আনব এবং এটি ব্যবহারকারীর কাছে দেখাব।

এই আনার অংশটি আমি এটি একটি পটভূমির থ্রেডে করতে চাই (ইউআই মূল থ্রেডটি ব্লক না করার জন্য)। আমি এটি এর মতো করি -

[self performSelectorInBackground:@selector(getResultSetFromDB:) withObject:docids];

আনার এবং কিছুটা প্রক্রিয়াজাতকরণের পরে, আমার ইউআই আপডেট করতে হবে। তবে (একটি ভাল অনুশীলন হিসাবে) আমাদের পটভূমির থ্রেড থেকে ইউআই আপডেট করা উচিত নয় upd আমি selectorমেনথ্রেডে যেমন কল করি -

[self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO];

তবে আমার অ্যাপটি প্রথম ধাপে ক্রাশ হয়ে গেছে। যেমন একটি পটভূমি থ্রেড শুরু। এটি কি আইওএস-এ ব্যাকগ্রাউন্ড থ্রেড শুরু করার উপায় নয়?

আপডেট 1:[self performSelectorInBackground.... আমি এই স্ট্যাকট্রেস পাওয়ার পরে , এখন পর্যন্ত কোনও তথ্য নেই -

এখানে চিত্র বর্ণনা লিখুন

আপডেট 2: এমনকি আমি চেষ্টা করেছি, এর মতো একটি পটভূমি থ্রেড শুরু করে - [NSThread detachNewThreadSelector:@selector(getResultSetFromDB:) toTarget:self withObject:docids];তবে এখনও আমি একই স্ট্যাকট্র্যাস পাই।

ঠিক তাই আমি স্পষ্ট করে বলি, যখন আমি মূল থ্রেডে এই অপারেশনটি করি তখন সবকিছুই মসৃণ হয় ...

আপডেট 3 আমি ব্যাকগ্রাউন্ড থেকে চালানোর চেষ্টা করছি এই পদ্ধতি

- (void)getResultSetFromDB:(NSMutableArray *)toProceessDocids
{
    SpotMain *mirror = [[SpotMain alloc] init];
    NSMutableArray *filteredDocids = toProceessDocids;

    if(![gMediaBucket isEqualToString:@""])
        filteredDocids = [mirror FetchDocIdsForMediaBucketWithDocID:filteredDocids mBucket:gMediaBucket numRes:-1];
    if(![gMediaType isEqualToString:@""])
        filteredDocids = [mirror FetchDocIdsForMediaType:filteredDocids mediaType:gMediaType numRes:-1];
    if(![gPlatform isEqualToString:@""])
        filteredDocids = [mirror FetchDocIdsForPlatformID:filteredDocids platformId:@"1" numRes:-1];

    self.resultSet = [mirror FetchObjectFromDocid:filteredDocids];
    [filteredDocids release];
    [mirror release];

    [self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO];
    return;
}

আপনি কোন ত্রুটি / ক্র্যাশ লগ পাবেন?
jtbandes

দয়া করে আমার আপডেটগুলি দেখুন ...
শ্রীকর অপালরাজু

আপনি দয়া করে পটভূমিতে যে পদ্ধতিটি কল করছেন তা প্রদর্শন করতে পারেন? এবং অবজেক্টটি docidsবজায় রয়েছে কিনা তা নিশ্চিত করুন ।
রহিম করিমের

হ্যাঁ, docidsহয় retain। আমি এর মধ্যে করা আছে .hযেমন@property (nonatomic, retain) NSMutableArray *docids;
Srikar Appalaraju

পদ্ধতিগুলি সাথে উপসর্গ করবেন না get; এটি ঠিক হওয়া উচিতresultSetFromDB:
ববম

উত্তর:


270

যদি আপনি performSelectorInBackground:withObject:কোনও নতুন থ্রেড স্প্যান করতে ব্যবহার করেন তবে পারফর্মড নির্বাচক নতুন থ্রেডের অটোরিলিজ পুল স্থাপন, লুপ চালানো এবং অন্যান্য কনফিগারেশন বিশদ সম্পর্কিত জন্য দায়ী - অ্যাপলের থ্রেডিং প্রোগ্রামিং গাইডের "এনএসবজেক্ট টু স্পেন এ থ্রেড ব্যবহার করুন" দেখুন ।

আপনি সম্ভবত গ্র্যান্ড সেন্ট্রাল ডিসপ্যাচ ব্যবহার করা ভাল , যদিও:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self getResultSetFromDB:docids];
});

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


ক্রিস নোলেটের কাছে একটি টুপি টিপ দিয়ে আপডেট করা হয়েছে , যিনি উপরের কোডটি আরও সহজ করে তোলে এবং অ্যাপলের সর্বশেষ জিসিডি কোড উদাহরণ সহ রাখে এমন একটি পরিবর্তন প্রস্তাব করেছিলেন।


শান্ত! এটা জানতাম না। [NSThread detachNewThreadSelector:@selector....এটিও কি প্রযোজ্য ?
শ্রীকর অপালরাজু

হ্যাঁ. প্রতি অ্যাপল ডক্স, কলিং performSelectorInBackground:withObject:"একই যেন আপনি বলা হয় detachNewThreadSelector:toTarget:withObject:পদ্ধতি NSThreadবর্তমান বস্তু, নির্বাচক, এবং পরামিতি হিসেবে প্যারামিটার বস্তুর সঙ্গে।"
স্কট ফোর্বস

এই বিষয়ে (unsigned long)NULLএবং এর 0মধ্যে একটি পার্থক্য আছে ?
Sti

4
অ্যাপল দেব ডক্স থেকে @ এসটিআই : দ্রষ্টব্য: প্রেরণ_গেট_গ্লোবাল_কুই ফাংশনের দ্বিতীয় যুক্তি ভবিষ্যতের বিস্তারের জন্য সংরক্ষিত। আপাতত, এই যুক্তিটির জন্য আপনার সর্বদা 0 পাস করা উচিত।
জাওয়াদ আল শায়খ

আমি কি তখন অপারেশন ফলাফলের সাথে ইউআই আপডেট করতে পারফেক্টসইলেকটরঅনমেনথ্রেড ব্যবহার করব বা জিসিডি সহ ইউআই আপডেট করার আরও সুসংগত উপায় আছে?
ইলিয়া ডেনিসভ

9

আসলে এটি জিসিডির সাথে বেশ সহজ। একটি আদর্শ ওয়ার্কফ্লো এমন কিছু হবে:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
    dispatch_async(queue, ^{
        // Perform async operation
        // Call your method/function here
        // Example:
        // NSString *result = [anObject calculateSomething];
                dispatch_sync(dispatch_get_main_queue(), ^{
                    // Update UI
                    // Example:
                    // self.myLabel.text = result;
                });
    });

জিসিডি সম্পর্কিত আরও তথ্যের জন্য আপনি অ্যাপলের ডকুমেন্টেশনগুলি এখানে দেখতে পারেন


4

কোন অবজেক্টটি প্রকাশ হচ্ছে এবং তারপরে অ্যাক্সেস করা হবে তা জানতে এনএসজোম্বিএনবল সক্ষম করুন । তারপরে এর getResultSetFromDB:সাথে কিছু করার আছে কিনা তা পরীক্ষা করে দেখুন। docidsভিতরে কিছু আছে কিনা এবং এটি ধরে রাখা হচ্ছে কিনা তাও পরীক্ষা করে দেখুন ।

এইভাবে আপনি নিশ্চিত হতে পারেন যে কোনও ভুল নেই।


আপনি যে লাইনটি ব্যবহার করেছেন সেটি মূল থ্রেডে অনায়াসে চালিত করুন copy
নিকোলাস এস

আমি এটি মূল থ্রেড থেকে ব্যবহার করি এবং এটি হঠাৎ ক্র্যাশ করার পরিবর্তে এই পদ্ধতিটিতে হিট হয় -[self getResultSetFromDB:docids];
শ্রীকর অপালরাজু

আমি আপনাকে যা বলেছি তা কি আপনি সক্ষম করেছেন?
নিকোলাস এস

এই লাইনে একটি ব্রেকপয়েন্ট দিন: স্পটমেন * আয়না = [[স্পটমাইন বরাদ্দ] init]; এবং আমাকে বলুন যদি এটির হিট হয় এবং, যদি তেমন হয় তবে কোন লাইনটি ক্র্যাশ করেছে। জম্বিগুলি সক্ষম করুন দয়া করে যাতে আমরা একটি পরিষ্কার ত্রুটি লগ পেতে পারি।
নিকোলাস এস

হ্যাঁ, আমি জম্বিগুলি সক্ষম করেছি। আমি এটি পেয়েছি - -0 2011-08-14 12: 49: 42.697 এফএলও [16211: 707] *** - [FMResultSet রিলিজ]: বার্তাটি dexocated উদাহরণ 0x2bff80 2011-08-14 12: 49: 42.697 এফএলও [16211: 1607] *** __NS আউটোরলেজ নোপুল (): ক্লাসের 0x2c0cc0 অবজেক্ট __NSCFData কোনও জায়গায় কোনও পুল না দিয়ে অটোরেলাইজ হয়েছে - শুধু . Also when I try to call this method from background thread I do not reach স্পটমেইন * আয়না ফাঁস করছে ... `, ব্যাকগ্রাউন্ড থ্রেডে প্রবেশের পরপরই এটি ক্র্যাশ হয়ে গেছে ...
শ্রীকর অ্যাপলরাজু

2

আইওএসের সাথে আসা ডিফল্ট স্ক্লাইট লাইব্রেরিটি এসকিউএলআইপিথ্রেডএএসএফ ম্যাক্রো ব্যবহার করে সংকলিত হয় না comp এটি আপনার কোড ক্রাশ হওয়ার কারণ হতে পারে।


2

সুইফট 2.x উত্তর:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
        self.getResultSetFromDB(docids)
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.