Re: [問題] class method
※ 引述《Gsus (肉元,吉米,助教)》之銘言:
: 推 hothero:nsobject的performSelectorInBackground就只能用void嗎? 10/24 17:30
先回答其中一半的問題好了:如果另外一個 method 只能回傳
void,有什麼辦法,可以讓 method 裡頭處理完的資料傳出來?
大概有幾種作法,第一種方法是用指標:
- (void)myMethodWithString:(NSString *)inString
outString:(NSString **)outString
{
/// 看想要對 inString 做什麼
*outString = @"Hi";
}
NSString *inString = nil;
NSString *outString = nil;
[self myMethodWithString:inString outString:&outString];
NSLog(@"outString:%@", outString);
另外一種作法是用 block:
- (void)myMethodWithString:(NSString *)inString
completeBlock:(void (^)(NSString *))myBlock
{
myBlock(@"Hi");
}
NSString *inString = nil;
__block NSString *outString = nil; // 注意,在 block 中,如果想要使用
// 外面的變數,就需要這樣宣告
[self myMethodWithString:nil completeBlock:^(NSString *string) {
outString = [string retain];
}];
NSLog(@"outString:%@", outString);
另外就是當做 C 來寫:
void myFunction(NSString *inString) {
NSLog(@"inString:%@", inString);
}
- (void)myMethodWithString:(NSString *)inString
completeFunction:(void *)inFunction
{
void (* myFunc)(NSString *);
myFunc = (void *)inFunction;
myFunc(@"Hi");
}
NSString *inString = nil;
[self myMethodWithString:inString completeFunction:myFunction];
基本上,如果是要給 performSelectorInBackground 用的話,大概
第一種與第三種作法都不太行,因為 performSelectorInBackground:
withObject: 後面只能夠傳一個 ObjC 物件,如果要傳多個參數的話
通常會包在一個 NSArray 裡頭,但是 NSArray 只能夠加入 ObjC 物件。
(換句話說,block 是可以當成 ObjC 物件的)
而第一種作法做大的問題是,在另外一個 method 裡頭,並沒有回來
告訴你,要做的事情到底做完了沒有。
所以,如果不想管比較舊的作業系統,就放心大膽的用 block,要不
然,就是安排一個 delegate。
--
zonble.net
cocoa.zonble.net
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.44.189.129
推
10/25 00:30, , 1F
10/25 00:30, 1F
推
10/25 00:54, , 2F
10/25 00:54, 2F
推
10/25 01:02, , 3F
10/25 01:02, 3F
討論串 (同標題文章)